<?php

class Sinistro2_Model_ProcessosArquivos extends Agro_Db_Table_Abstract {
	protected $_schema = 'sinistro';
	protected $_name = 'processos_arquivos';
	protected $_primary = 'id';
	
	public function save($arquivo, $processo, $ds_chave_tipo_arquivo) {
		$TipoArquivo = new Sistema_Model_TipoArquivoProcesso();
		$Row = $this->createRow();
		
		$Row->id_tipo_arquivo = $TipoArquivo->getIdArquivo($ds_chave_tipo_arquivo);
		$Row->ds_nome_arquivo = $arquivo;
		$Row->id_processo = $processo;
		
		return $Row->save();
	}

	function deletar(int $idProcesso, string $nomeArquivo, string $chaveTipoArquivo = ''): void
	{
		$sql = "
			UPDATE sinistro.processos_arquivos
			SET fl_ativo = FALSE
			WHERE id_processo = {$idProcesso}
				AND ds_nome_arquivo = '{$nomeArquivo}'
		";

		if (!empty($chaveTipoArquivo)) {
			$sql .= " AND id_tipo_arquivo = (SELECT id FROM sistema.tipo_arquivo_processo WHERE ds_chave_tipo_arquivo = '$chaveTipoArquivo')";
		}

		$sql .= ';';
		
		$this->_db->query($sql);
	}
	
	public function getProcessosArquivos($idProcesso, $flExibirNaoEnviados=false, $idProcessoArquivo=null) {
		$Processo = new Sinistro2_Model_Processos();
	    
		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('pa'=>'sinistro.processos_arquivos'), '*');
		$select->join(array('ta'=>'sistema.tipo_arquivo_processo'), 'pa.id_tipo_arquivo = ta.id', array('ds_tipo_arquivo','ds_chave_tipo_arquivo'));
        $select->join(array('p'=>'sinistro.processos'),'p.id = pa.id_processo',false);
		$select->where('pa.fl_del = false');
		$select->where('pa.fl_ativo = true');
		$select->where('pa.id_processo = ?', $idProcesso);
		$select->where('ta.ds_chave_tipo_arquivo <> ?', 'COMPROVANTE_TED_DOC');

		if($idProcessoArquivo){
		    $select->where('pa.id = ?', $idProcessoArquivo);
		}

		$select->order(array('p.id desc', 'pa.dt_criacao', 'ta.ds_tipo_arquivo'));

		return $this->fetchAll($select)->toArray();
	}
	
	public function getArquivo($idProcessoArquivo) {
		$Processo = new Sinistro2_Model_Processos();
	    
		$select = $this->select();
		$select->setIntegrityCheck(false);
		$select->from(array('pa'=>'sinistro.processos_arquivos'), array('id_processo', 'ds_nome_arquivo'));
		$select->join(array('ta'=>'sistema.tipo_arquivo_processo'), 'pa.id_tipo_arquivo = ta.id', array('ds_tipo_arquivo','ds_chave_tipo_arquivo'));
		$select->where('pa.fl_del = false');
		$select->where('pa.fl_ativo = true');
		$select->where('pa.id = ?', $idProcessoArquivo);

		return $this->fetchAll($select)->toArray();
	}
	
	public function getCountTipoArquivo($cpf_cnpj, $idTipoArquivo){
		$select = $this->select();
		$select->setIntegrityCheck(false);
    	$select->from(array('pa'=>'sinistro.processos_arquivos'), array('id'));
        $select->join(array('p'=>'sinistro.processos'), 'p.id = pa.id_processo', false);
    	$select->join(array('pr'=>'seguro.propostas'), 'pr.id = p.id_proposta', false);
    	$select->join(array('pp'=>'seguro.propostas_proponentes'),'pp.id_proposta = pr.id',false);
		$select->where('pa.id_tipo_arquivo = ?', $idTipoArquivo);
    	$select->where('pp.cpf_cnpj = ?', $cpf_cnpj);

		return $this->fetchAll($select)->count();
	}
	
	public function nextSequenceId() {
		$value = $this->_db->fetchOne("SELECT NEXTVAL('sinistro.processos_arquivos_id_seq')");
		return $value;
    }

    /**
     * @param array $safras
     * @param int|null $idTipoArquivo
     * @param bool $somenteNaoTransmitidos
     * @return Zend_Db_Table_Rowset_Abstract
     */
    public function getArquivosBySafra(
        array $safras = [],
        int $idTipoArquivo = null,
        bool $somenteNaoTransmitidos = false
    ) {
        if (empty($safras)) {
            $safras = [(new Produto_Model_Safras())->getSafraAtual('id')];
        }

        $campos = [
            'sp.id as id_processo',
            'spa.id as id_arquivo',
            'spa.id_tipo_arquivo',
            'spa.ds_nome_arquivo',
            'sl.id as id_liquidacao',
            'sl.id_status as id_status_liquidacao',
        ];

        $select = $this->select()->setIntegrityCheck(false);
        $select->from(['spa' => "{$this->_schema}.{$this->_name}"], $campos)
            ->join(['sp' => 'sinistro.processos'], 'sp.id = spa.id_processo', false)
            ->join(['sprop' => 'seguro.propostas'], 'sprop.id = sp.id_proposta', false)
            ->join(['pp' => 'produto.produtos'], 'pp.id = sprop.id_produto', false)
            ->join(['sl' => 'sinistro.liquidacoes'], 'sl.id_processo = sp.id', false)
            ->join(['slisc' => 'sinistro.liquidacoes_itens_segurados_coberturas'], 'slisc.id_liquidacao = sl.id', false)
            ->where('pp.id_safra in (' . implode(', ', $safras) . ')');

        if (!empty($idTipoArquivo)) {
            $select->where('spa.id_tipo_arquivo = ?', $idTipoArquivo);
        }

        if ($somenteNaoTransmitidos) {
            $sqlNotExists = "select 1 ";
            $sqlNotExists .= "from log.log_sinistro_arquivos_transmissao llsat ";
            $sqlNotExists .= "where llsat.id_processo = spa.id_processo ";
            $sqlNotExists .= "and llsat.id_arquivo = spa.id ";

            $select->where(
                "not exists (?)",
                new Zend_Db_Expr($this->getDefaultAdapter()->quoteInto($sqlNotExists, null))
            );
        }

        $select->group(['sl.id', 'sp.id', 'spa.id', 'spa.id_tipo_arquivo', 'spa.ds_nome_arquivo']);

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