<?php

class Seguro_Model_Vistoriapreviaempresaarquivos extends Agro_Db_Table_Abstract {
	protected $_schema = 'seguro';
	protected $_name = 'propostas_vistorias_previas_arquivos';
	protected $_primary = 'id';
	public $_order = array('ds_nome_arquivo', 'dt_criacao');

	public function save($data) {

		try{

			if (!$data['id'] ) $Row = $this->createRow(); else $Row = $this->getRow($data['id']);
	
			$Row->ds_nome_arquivo = $data['ds_nome_arquivo'];
			$Row->id_proposta_vistoria = $data['id_proposta_vistoria'];
			$Row->id_tipo_arquivo_laudo_previa = $data['id_tipo_arquivo_laudo_previa'];
			$Row->fl_transmitido_seguradora = $data['fl_transmitido_seguradora'] ?? 'false';
			
	
			$Row->save();
			return true;
		
		}catch (Exception $e){ 
			return false;
		}
		
	}

	public function findArquivosFotoTransmitidosViaTabletByIdSafra(int $idSafra)
	{
		$query = $this->select()
			->setIntegrityCheck(false)
			->from(['pvpa' => 'seguro.propostas_vistorias_previas_arquivos'], ['id','id_proposta_vistoria','ds_nome_arquivo'])
			->join(['pvp' => 'seguro.propostas_vistorias_previas'], 'pvp.id = pvpa.id_proposta_vistoria', '')
			->join(['p' => 'seguro.propostas'], 'p.id = pvp.id_proposta', '')
			->join(['pr' => 'produto.produtos'], 'pr.id = p.id_produto', '')
			->where('pvpa.id_tipo_arquivo_laudo_previa = 3')
			->where('pvpa.fl_transmitido_seguradora is false')
			->where('pvp.fl_transmitido_tablet is true')
			->where('pr.id_safra >= ?', $idSafra);

		return $this->fetchAll($query);
	}

	public function findIdsPropostaVistoriasPreviasNaoTransmitidosByIdSafra(
		int $idSafra,
		int $idStatus = Sistema_Model_Status::VP_TRANSMITIDA,
		bool $flTransmitidoSeguradora = false
	): string {
		$query = $this->select()
			->setIntegrityCheck(false)
			->from(['pvpa' => 'seguro.propostas_vistorias_previas_arquivos'], ['id_proposta_vistoria'])
			->join(['pvp' => 'seguro.propostas_vistorias_previas'], 'pvp.id = pvpa.id_proposta_vistoria', '')
			->join(['p' => 'seguro.propostas'], 'p.id = pvp.id_proposta', '')
			->join(['pr' => 'produto.produtos'], 'pr.id = p.id_produto', '')
			->where('pvpa.id_tipo_arquivo_laudo_previa = 3')
			->where('pvpa.fl_transmitido_seguradora = ' .( $flTransmitidoSeguradora ? '\'t\'' : '\'f\''))
			->where('pvp.fl_transmitido_tablet is true')
			->where('pvp.id_status = ?', $idStatus)
			->where('pr.id_safra >= ?', $idSafra)
			->group('pvpa.id_proposta_vistoria');

		$arquivos = $this->fetchAll($query);
		
		$idsPropostasVistoriasPrevias = '';
		$separador = '';

		foreach ($arquivos as $arquivo) {
			$idsPropostasVistoriasPrevias .= $separador . $arquivo['id_proposta_vistoria'];
			$separador = ',';
		}
		
		return $idsPropostasVistoriasPrevias;
	}

	public function findIdsPropostaVistoriaPreviaToFixArquivosRecebidosByIdSafra(int $idSafra): string
	{
		$sql = "
			SELECT
				propostas_vistorias_previas.id AS id_proposta_vistoria,
				propostas_vistorias_previas.id_proposta,
				propostas_vistorias_previas.id_vistoria,
				propostas_vistorias_previas.id_status,
				propostas_vistorias_previas.fl_transmitido_tablet,
				total_recebidas.contagem AS qtd_fotos_enviadas,
				recebidas_true.contagem AS qtd_fotos_true
			FROM
				seguro.propostas_vistorias_previas
				JOIN seguro.propostas ON propostas.id = propostas_vistorias_previas.id_proposta
				JOIN produto.produtos ON produtos.id = propostas.id_produto
				JOIN (
					SELECT
						propostas_vistorias_previas_arquivos.id_proposta_vistoria,
						COALESCE(
							COUNT(
								propostas_vistorias_previas_arquivos.fl_transmitido_seguradora
							),
							0
						) AS contagem
					FROM
						seguro.propostas_vistorias_previas_arquivos
					WHERE
						propostas_vistorias_previas_arquivos.fl_transmitido_seguradora = TRUE
						AND propostas_vistorias_previas_arquivos.id_tipo_arquivo_laudo_previa = 3
					GROUP BY
						propostas_vistorias_previas_arquivos.id_proposta_vistoria
				) AS recebidas_true ON recebidas_true.id_proposta_vistoria = propostas_vistorias_previas.id
				JOIN (
					SELECT
						propostas_vistorias_previas_arquivos.id_proposta_vistoria,
						COALESCE(
							COUNT(
								propostas_vistorias_previas_arquivos.fl_transmitido_seguradora
							),
							0
						) AS contagem
					FROM
						seguro.propostas_vistorias_previas_arquivos
					WHERE
						propostas_vistorias_previas_arquivos.id_tipo_arquivo_laudo_previa = 3
					GROUP BY
						propostas_vistorias_previas_arquivos.id_proposta_vistoria
				) AS total_recebidas ON total_recebidas.id_proposta_vistoria = propostas_vistorias_previas.id
			WHERE
				produtos.id_safra >= {$idSafra}
				AND propostas_vistorias_previas.id_status = 226
				AND propostas_vistorias_previas.fl_transmitido_tablet = TRUE
				AND total_recebidas.contagem = recebidas_true.contagem;
		";

		$propostasVistoriasPrevias = $this->_db->fetchAll($sql);
	    $idsPropostasVistoriasPrevias = '';
		$separador = '';						

		foreach ($propostasVistoriasPrevias as $pvp) {
			$idsPropostasVistoriasPrevias .= $separador . $pvp['id_proposta_vistoria'];
			$separador = ',';
		}

		return $idsPropostasVistoriasPrevias;
	}

	public function getArquivos(int $id_proposta_vistoria)
    {
        $select = $this->select()->setIntegrityCheck(false)->distinct();
        $select->from(
            array("vpa" => $this->_schema . "." . $this->_name),
            array(
                'id',
                'id_proposta_vistoria',
                'ds_nome_arquivo',
                'id_tipo_arquivo_laudo_previa',
                'fl_fila_transmissao', 'dt_criacao'
            )
        );
        $select->join(
            array('vp' => 'seguro.propostas_vistorias_previas'),
            'vp.id = vpa.id_proposta_vistoria',
            array('id_status_analise', 'fl_transmitido', 'fl_transmitido_tablet')
        );
        $select->join(
            array('t' => 'sistema.tipo_arquivo_laudo_previa'),
            't.id = vpa.id_tipo_arquivo_laudo_previa',
            'ds_tipo_arquivo'
        );
        $select->where('vpa.id_proposta_vistoria = ?', $id_proposta_vistoria);
        $select->order('id');

        return $this->getAdapter()->fetchAll($select);
    }

	public function getArquivosFoto(int $idPropostaVistoria): array
	{
		$select = $this->select()->setIntegrityCheck(false)->distinct(true);
		$select->from(array(
			"vpa" => $this->_schema.".".$this->_name),
			array(
				'id',
				'id_proposta_vistoria',
				'ds_nome_arquivo',
				'id_tipo_arquivo_laudo_previa',
				'fl_fila_transmissao',
				'fl_transmitido_seguradora',
				'dt_criacao'
			));
		$select->where('vpa.id_proposta_vistoria = ?', $idPropostaVistoria);
		$select->where('vpa.id_tipo_arquivo_laudo_previa = ?', Sistema_Model_TipoArquivoLaudoPrevia::TIPO_FOTO);
		$select->order('id');	

		$rs = $this->getAdapter()->fetchAll($select);
		
		return $rs;
	}
	
	public function getNomeArquivo($id_arquivo) {
		$select = $this->select()->setIntegrityCheck(false)->distinct(true);
		$select->from(array('a'=>'seguro.propostas_vistorias_previas_arquivos'), 'ds_nome_arquivo');
		$select->where('id = ?', $id_arquivo);

		return $this->_db->fetchOne($select);
	}
	
	
	public function getCountArquivo(int $id_proposta_vistoria, $idTipoArquivoLaudoPrevia = null)
    {
        $select = $this->select();
        $select->from(array('a' => 'seguro.propostas_vistorias_previas_arquivos'));
        $select->where('id_proposta_vistoria = ?', $id_proposta_vistoria);

        if (!empty($idTipoArquivoLaudoPrevia)) {
            $select->where("id_tipo_arquivo_laudo_previa = {$idTipoArquivoLaudoPrevia}");
        }

        return $this->fetchAll($select)->count();
    }
	
	public function getMaxArquivo($id_proposta_vistoria){
		$select = $this->select()->setIntegrityCheck(false)->distinct(true);
		$select->from(array('a'=>'seguro.propostas_vistorias_previas_arquivos'), 'MAX(id)');
		$select->where('id_proposta_vistoria = ?', $id_proposta_vistoria);

		return $this->_db->fetchOne($select);
	}
	
	/**
	 * Libera um arquivo de laudo da prévia
	 * 
	 * @param int $idArquivo
	 * @param string $nomeArquivo
	 */
	public function transmiteArquivo(int $idArquivo, string $nomeArquivo): void
	{	
		$sql = "UPDATE seguro.propostas_vistorias_previas_arquivos SET fl_fila_transmissao = true WHERE id = {$idArquivo}";
		$rs = $this->_db->query($sql);

		if (!$rs) {
			throw new Exception("Não foi possível liberar o arquivo.");
		}

		$origem = APPLICATION_PATH . '/upload_files/laudoprevia/' . $nomeArquivo;
		$destino = PATH_LAUDOS . '/' . $nomeArquivo;

		if (!symlink($origem, $destino)) {
			throw new Exception("Erro ao copiar arquivo!");
		}
	}

    /**
     * Devolve um arquivo de laudo da prévia
     * @param int $idArquivo
     * @param string $nomeArquivo
     * @throws Exception
     */
	public function devolveArquivo(int $idArquivo, string $nomeArquivo): void
	{
		$sql = "UPDATE seguro.propostas_vistorias_previas_arquivos SET fl_fila_transmissao = false WHERE id = {$idArquivo}";
		$rs = $this->_db->query($sql);

		if (!$rs) {
			throw new Exception("Não foi possível devolver o arquivo.");
		}

		$sanitizedPath = PATH_LAUDOS . '/' . basename($nomeArquivo);
		if (file_exists($sanitizedPath)) {
			unlink($sanitizedPath);
		}
	}
	
	public function getIdPropostaVistoria($id_arquivo){
		
		$select = $this->select();
		$select->from(array('a'=>'seguro.propostas_vistorias_previas_arquivos'),'id_proposta_vistoria');
		$select->where('id = ?', $id_arquivo);

		return $this->_db->fetchOne($select);
	}	
	
	
	public function atualizaFlagArquivo($nomeArquivo){

		try{
			$this->_db->query("UPDATE seguro.propostas_vistorias_previas_arquivos SET fl_fila_transmissao = true WHERE ds_nome_arquivo = '".$nomeArquivo."'");
			return true;

		}catch (Exception $e){
			die($e);
		}
	}
	
	public function getLaudosAutomaticosPendentes($safra = null)
    {
        $whereSafra = !empty($safra) ? "produtos.id_safra = {$safra}" : "produtos.id_safra >= 24";

        $sql = "SELECT propostas.id_proposta_mae ";
        $sql .= "        , propostas.id ";
        $sql .= "        , propostas_vistorias_previas.id as id_proposta_vistoria ";
        $sql .= "     FROM seguro.propostas ";
        $sql .= "     JOIN produto.produtos ";
        $sql .= "       ON produtos.id = propostas.id_produto ";
        $sql .= "     JOIN seguro.propostas_vistorias_previas ";
        $sql .= "       ON propostas_vistorias_previas.id_proposta = propostas.id ";
        $sql .= "LEFT JOIN seguro.propostas_vistorias_previas_arquivos ";
        $sql .= "       ON propostas_vistorias_previas_arquivos.id_proposta_vistoria         = propostas_vistorias_previas.id ";
        $sql .= "      AND propostas_vistorias_previas_arquivos.id_tipo_arquivo_laudo_previa = 2 ";
        $sql .= "    WHERE {$whereSafra} ";
        $sql .= "      AND propostas_vistorias_previas.id_status = 71 ";
        $sql .= "      AND propostas_vistorias_previas_arquivos.id_proposta_vistoria IS NULL ";
        $sql .= " ORDER BY propostas.id_proposta_mae ";

        return $this->_db->fetchAll($sql);
    }
}
