<?php

class Endosso_Model_Solicitacao extends Agro_Db_Table_Propostas {
    const DS_CHAVE_CANCELADO = 'CANCELADO';
    const DS_CHAVE_SOLICITACAO_ENDOSSO_ACEITO_EFETIVADO = 'SOLICITACAO_ENDOSSO_ACEITO_EFETIVADO';
    const DS_CHAVE_SOLICITACAO_ENDOSSO_AGUARDANDO_FORM_ASS = 'SOLICITACAO_ENDOSSO_AGUARDANDO_FORM_ASS';
    const DS_CHAVE_SOLICITACAO_ENDOSSO_CANCELADO_CORRETOR = 'SOLICITACAO_ENDOSSO_CANCELADO_CORRETOR';
    const DS_CHAVE_SOLICITACAO_ENDOSSO_NAO_ANALISADO = 'SOLICITACAO_ENDOSSO_NAO_ANALISADO';
    const DS_CHAVE_SOLICITACAO_ENDOSSO_NEGADO = 'SOLICITACAO_ENDOSSO_NEGADO';
    const DS_CHAVE_SOLICITACAO_ENDOSSO_PENDENTE = 'SOLICITACAO_ENDOSSO_PENDENTE';

    const ID_STATUS_CANCELADO = 271;
    const ID_STATUS_SOLICITACAO_ENDOSSO_ACEITO = 182;
    const ID_STATUS_SOLICITACAO_ENDOSSO_ACEITO_EFETIVADO = 198;
    const ID_STATUS_SOLICITACAO_ENDOSSO_ANALISE = 224;
    const ID_STATUS_SOLICITACAO_ENDOSSO_CANCELADO_CORRETOR = 199;
    const ID_STATUS_SOLICITACAO_ENDOSSO_NAO_ANALISADO = 180;
    const ID_STATUS_SOLICITACAO_ENDOSSO_NEGADO = 183;
    const ID_STATUS_SOLICITACAO_NAO_FINALIZADA = 237;
    const ID_STATUS_SOLICITACAO_ENDOSSO_PENDENTE = 181;

    protected $_rowClass = 'Seguro_Model_Row_Proposta';
    protected $_name = 'propostas_endosso_solicitacao';
    protected $_schema = 'seguro';
    protected $_primary = 'id';

    public function anexarComplementar(array $data) {
        $extensoes = array('pdf','png','jpg','jpeg','jfif');

        $Adapter = new Zend_File_Transfer_Adapter_Http();
        $Adapter->setDestination(APPLICATION_PATH.'/upload_files/solicitacoes/');
        $files = $Adapter->getFileInfo();

        $Row = $this->getRow($data['id']);
        $Row->id_status = Agro_Db_Table_Abstract::getIdStatus('SOLICITACAO_ENDOSSO_NAO_ANALISADO');

        $ModelArquivo = new Endosso_Model_SolicitacaoArquivos();
        $RowArquivo = $ModelArquivo->createRow();
        $RowArquivo->id_solicitacao = $data['id'];
        $RowArquivo->fl_assinatura = $data['fl_assinatura'];

        if (!empty($files) && is_array($files)) {

            foreach ($files as $file) {
                $newFile = $this->geraNomeArquivo($data, $file['name'], true);
                $Adapter->addFilter('Rename', array('target' => APPLICATION_PATH.'/upload_files/solicitacoes/' . $newFile, 'overwrite' => false));

                if ($Adapter->receive($file['name'])) {
                    $RowArquivo->ds_nome_arquivo = $newFile;
                }
            }

            $extensao = strtolower(substr($newFile,strpos($newFile,'.')+1,4));

            if (!in_array($extensao, $extensoes)) {
                throw new Exception('Insira um arquivo dos tipos PDF, PNG, JPG, JPEG ou JFIF.', 1);
            }
        }

        $RowArquivo->save();

        $Row->id_status = $data['id_status'] ? $data['id_status'] : $Row->id_status;
        $Row->save();

        $this->getAdapter()->query('update seguro.propostas_endosso_solicitacao_status set fl_ativo = false where id_solicitacao = '.$Row->id);

        $dataStatus = array('id_solicitacao' => $Row->id,
                            'id_status' => $data['id_status'] ? $data['id_status'] : $Row->id_status,
                            'ds_observacao' =>  $data['ds_observacao'] ? $data['ds_observacao'] : ''
                        );
        $ModelStatus = new Endosso_Model_SolicitacaoStatus();
        $ModelStatus->save($dataStatus);

        return true;
    }

    public function anexar(array $data) {
        $extensoes = array('pdf','png','jpg','jpeg','jfif');

        try {
            $Adapter = new Zend_File_Transfer_Adapter_Http();
            $Adapter->setDestination(APPLICATION_PATH.'/upload_files/solicitacoes/');
            $files = $Adapter->getFileInfo();

            $Row = $this->getRow($data['id']);
            $Row->id_status = Agro_Db_Table_Abstract::getIdStatus('SOLICITACAO_ENDOSSO_NAO_ANALISADO');
            $Row->id_tipo_solicitacao = $Row->id_tipo_solicitacao;
            $Row->id_proposta = $data['id_proposta'];

            $ModelArquivo = new Endosso_Model_SolicitacaoArquivos();
            $RowArquivo = $ModelArquivo->createRow();
            $RowArquivo->id_solicitacao = $data['id'];
            $RowArquivo->fl_assinatura = $data['fl_assinatura'];

            if (!empty($files) && is_array($files)) {

            	foreach ($files as $file) {
	                $newFile = $this->geraNomeArquivo($Row, $file['name']);
	                $Adapter->addFilter('Rename', array('target' => APPLICATION_PATH.'/upload_files/solicitacoes/' . $newFile, 'overwrite' => true));

	                if ($Adapter->receive($file['name'])) {
	                    $RowArquivo->ds_nome_arquivo = $newFile;
	                }
            	}

                $this->getAdapter()->query('update seguro.propostas_endosso_solicitacao_arquivos set fl_ativo = false where fl_assinatura = true and id_solicitacao = '.$Row->id);
                $data['ds_observacao'] = 'Arquivo ' . $newFile . ' adicionado.';

                $extensao = strtolower(substr($newFile,strpos($newFile,'.')+1,4));

                if(!in_array($extensao, $extensoes)) {
                    return false;
                }
            }

            $RowArquivo->save();

            $Row->id_status = $data['id_status'] ? $data['id_status'] : $Row->id_status;
            $Row->save();

            $this->getAdapter()->query('update seguro.propostas_endosso_solicitacao_status set fl_ativo = false where id_solicitacao = '.$Row->id);

            $dataStatus = array('id_solicitacao' => $Row->id,
                                'id_status' => $data['id_status'] ? $data['id_status'] : $Row->id_status,
                                'ds_observacao' =>  $data['ds_observacao'] ? $data['ds_observacao'] : ''
                            );
            $ModelStatus = new Endosso_Model_SolicitacaoStatus();
            $ModelStatus->save($dataStatus);

            return true;
        } catch (Exception $e) {
            $this->setMessage($e->getMessage());
            return false;
        }

    }

    public function save(array $data) {
        if (!empty($data['id'])) {
            $Row = $this->getRow($data['id']);
        } else {
            $Row = $this->fetchRow(["id_proposta = {$data['id_proposta']}"]);
            $tipoSolicitacao = (new Endosso_Model_TiposSolicitacao())->find($data['id_tipo_solicitacao']);

            // Seta o usuário responsável default especificado no tipo de solicitação
            if (!empty($tipoSolicitacao) && !empty($tipoSolicitacao[0]['id_usuario_responsavel'])) {
                $data['id_usuario_responsavel'] = $tipoSolicitacao[0]['id_usuario_responsavel'];
            }
        }

        if (empty($Row)) {
            $Row = $this->createRow();
        }

        $idStatusAtual = (int)$Row['id_status'];
        $data['id_usuario_responsavel'] = $data['id_usuario_responsavel'] == '0'
            ? null
            : $data['id_usuario_responsavel'];

        $Row->id_status = Agro_Db_Table_Abstract::getIdStatus('SOLICITACAO_ENDOSSO_AGUARDANDO_FORM_ASS');
        $Row->id_tipo_solicitacao = $data['id_tipo_solicitacao'] ?? $Row->id_tipo_solicitacao;
        $Row->id_proposta = $data['id_proposta'] ?? $Row->id_proposta;
 
        $Row->id_usuario_responsavel = $data['id_usuario_responsavel']
            ?? $Row->id_usuario_responsavel;
        
        if ($data['ds_descricao'] != '£££' && !empty($data['ds_descricao'])) {
            $Row->ds_descricao = $data['ds_descricao'];
        }
        $Row->id_status = !empty($data['id_status']) ? $data['id_status'] : (!empty($Row->id_status) ? $Row->id_status : null);
        $Row->nr_parcelas = $data['nr_parcelas'] ? $data['nr_parcelas'] : $Row->nr_parcelas;

        if (array_key_exists('fl_ocorreu_sinistro', $data)) {
            $Row->fl_ocorreu_sinistro = $data['fl_ocorreu_sinistro'];
        }

        $Row->ds_campos_valores_iniciais = $data['ds_campos_valores_iniciais'] ? $data['ds_campos_valores_iniciais'] : $Row->ds_campos_valores_iniciais;

        if (isset($data['ds_campos_alteracoes'])) {
            $Row->ds_campos_alteracoes = $data['ds_campos_alteracoes'];

            if (empty($data['ds_campos_alteracoes'])) {
                $Row->ds_campos_alteracoes = null;
            }
        }
        $Row->save();

        $dataStatus = array(
            'id_solicitacao'     => $Row->id,
            'id_status'          => $data['id_status'] ? $data['id_status'] : $Row->id_status,
            'ds_observacao'      => $data['ds_observacao'] ? $data['ds_observacao'] : '',
            'id_usuario_criacao' => Zend_Auth::getInstance()->getIdentity()->id
        );

        $modelStatus = new Endosso_Model_SolicitacaoStatus();
        $rowSolicitacaoStatus = $modelStatus->fetchRow(["id_solicitacao = {$Row->id}"]);

        if (empty($rowSolicitacaoStatus)) {
            $modelStatus->save($dataStatus);

            return $Row->id;
        }

        if (!empty($data['salvaHistoricoStatus'])
            && ($data['cancelamentoAutomatico'] || $idStatusAtual !== (int) $data['id_status'])
        ) {
            $this->getAdapter()->query('update seguro.propostas_endosso_solicitacao_status set fl_ativo = false where id_solicitacao = ' . $Row->id);

            $modelStatus->save($dataStatus);
        }

        return $Row->id;
    }

    protected function geraNomeArquivo($Row, $nome_original, $complementar=false) {
        if ($complementar) {
            return 'Solicitacao_Endosso_Complementar_'. $Row['id'] . '_' .date('YmdHms'). '_' . $Row['id_proposta'] . '.' . Agro_Util::getExtension($nome_original);
        } else {
            return 'Solicitacao_Endosso_'. $Row->id . '_' .date('YmdHms'). '_' . $Row->id_proposta . '.' . Agro_Util::getExtension($nome_original);
        }
    }

    public function getData(array $where) {
        $User = Zend_Auth::getInstance()->getIdentity();

        $Select = $this->select()->setIntegrityCheck(false);
        $Select->from(array('spe' => 'seguro.propostas_endosso'), 'spe.fl_proposta_vigente');
        $Select->join(array('spr' => 'seguro.propostas'), 'spr.id = spe.id_proposta', array('id', 'id_endosso', 'id_status', 'spr.dt_vigencia_inicio', 'id_usuario_criacao', 'id_produto', 'ds_status_seguradora', 'nr_digito_verificador', 'nr_apolice', 'ds_identificador_seguradora', 'id_versao', 'seguro.nr_endosso(spr.id, spr.id_endosso) as nr_endosso', 'id_proposta_mae', 'id_proposta_endossada', 'seguro.id_proposta_mae_completo(spr.id) as id_proposta_mae_completo'));
        $Select->joinLeft(array('sps' => 'seguro.propostas_status'), 'sps.id_status = spr.id_status and sps.id_proposta = spr.id and sps.fl_ativo = true', false);
        $Select->join(array('spt' => 'seguro.propostas_proponentes'), 'spr.id = spt.id_proposta', array('ds_nome_proponente', 'cpf_cnpj'));
        $Select->join(array('spc' => 'seguro.propostas_corretores'), 'spr.id = spc.id_proposta', false);
        $Select->join(array('ppr' => 'produto.produtos'), 'ppr.id = spr.id_produto', array('ds_nome_abreviado', 'ds_nome_produto'));
        $Select->join(array('pg' => 'produto.produtos_geral'), 'pg.id = ppr.id_produto_geral', false);
        $Select->join(array('pcul' => 'produto.culturas'), 'pcul.id = pg.id_cultura', false);
        $Select->join(array('sf' =>  'produto.safras'), 'sf.id = ppr.id_safra', array('ds_nome_safra'));
        $Select->join(array('spd' => 'seguro.propostas_propriedades'), 'spr.id = spd.id_proposta', array('id_municipio'));
        $Select->join(array('smu' => 'sistema.municipios'), 'smu.id = spd.id_municipio', 'ds_nome_municipio');
        $Select->join(array('suf' => 'sistema.estados'), 'suf.id = smu.id_estado', 'ds_sigla');
        $Select->join(array('scr' => 'sistema.corretores'), 'spc.id_usuario = scr.id_usuario', array('ds_nome_fantasia'));
        $Select->join(array('sst' => 'sistema.status'), 'sst.id = spr.id_status', array('ds_cor', 'ds_chave', 'ds_status', 'cd_status'));
        $Select->join(array('sus' => 'sistema.usuarios'), 'sus.id = spr.id_usuario_criacao', 'ds_nome_usuario');
        $Select->joinLeft(array('spb' => 'seguro.proposta_boletos'), 'spr.id = spb.id_proposta AND spb.nr_parcela=1 and spb.fl_ativo = true and spb.id_versao = spr.id_versao', array('ds_identificador'));
        $Select->joinLeft(array('spv' => 'seguro.propostas_versoes'), 'spr.id_versao = spv.id', array('fl_pendente_transmissao', 'ds_nome_arquivo as digitalizacao'));
        $Select->joinLeft(array('speo' => 'seguro.propostas_endosso_opcoes'), 'speo.id_proposta = spr.id',false);
        $Select->joinLeft(array('ste' => 'seguro.tipo_endosso'), 'speo.id_endosso_opcao = ste.id', array('ds_tipo_endosso','ds_tipo'));

        if ($User->tp_usuario == 'P') {
            $Select->join(array('spre' => 'sistema.prepostos'), 'spre.id_corretor = scr.id AND spre.id_usuario = spr.id_usuario_criacao', null);
            $Select->where('spre.id_usuario = ?', $User->id);
        }

        if(Zend_Auth::getInstance()->getIdentity()->ds_chave == 'SEGURADORA_ESSOR'){
            $Select->where('ppr.id_safra >= 16');
        }
        if(Zend_Auth::getInstance()->getIdentity()->ds_chave == 'SEGURADORA'){
            $Select->where('ppr.id_safra < 16');
        }

        $this->getWhere($Select, $where);

        if ($this->_order) {
            $Select->order($this->_order);
        } else {
            $Select->order('spr.id');
        }

        $Select->where('sst.ds_chave <> ?', 'PROPOSTA_INCOMPLETA');
        $Select->where('sst.ds_chave <> ?', 'ENDOSSO_INCOMPLETO');
        $Select->where('sst.ds_chave <> ?', 'PROPOSTA_CANCELADA');
        $Select->where('sst.ds_chave <> ?', 'APOLICE_CANCELADA');
        $Select->where('sst.ds_chave <> ?', Seguro_Model_Propostas::DS_CHAVE_SOLICITACAO_CANCELADA);
        $Select->where('spe.fl_proposta_vigente = true');
        $Select->where('spr.id_status >= 4');

        return $Select;
    }

    public function getSolicitacaoComplemento($id_solicitacao) {
    	$Select = $this->select()->setIntegrityCheck(false);
    	$Select->from(array('pes' => 'seguro.propostas_endosso_solicitacao'), "to_char(pes.dt_criacao, 'dd/mm/yyyy') as dt_criacao_solicitacao");
    	$Select->join(array('ets' => 'seguro.endosso_tipo_solicitacao'), 'pes.id_tipo_solicitacao = ets.id', 'ds_tipo_endosso');
    	$Select->join(array('pp' => 'seguro.propostas_proponentes'), 'pes.id_proposta = pp.id_proposta', 'ds_nome_proponente');
    	$Select->where('pes.id = ?', $id_solicitacao);

    	return $this->fetchRow($Select);
    }

    public function getSolicitacoesByProposta(int $idProposta, bool $possuiSolicitacao = false)
    {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(['p1' => 'seguro.propostas'], false);
        $select->join(['p2' => 'seguro.propostas'], 'p2.id_proposta_mae = p1.id_proposta_mae', ['p2.id_status as id_status_proposta']);
        $select->join(['s' => 'sistema.status'], 's.id = p2.id_status', false);
        $select->joinLeft(['pes' => "{$this->_schema}.{$this->_name}"], 'pes.id_proposta = p2.id', '*');
        $select->joinLeft(['ss' => 'sistema.status'], 'ss.id = pes.id_status', ['ss.ds_chave as ds_chave_status_solicitacao']);
        $select->where("p1.id = {$idProposta}");

        if ($possuiSolicitacao) {
            $select->where('pes.id is not null');
        }

        $select->order("p2.id desc, pes.id desc");

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

    public function finalizarSolicitacao(int $idSolicitacao)
    {
        $this->update(
            ['id_status' => self::ID_STATUS_SOLICITACAO_ENDOSSO_NAO_ANALISADO],
            "id = {$idSolicitacao}"
        );
    }

    public function getSolicitacoesSafraAnalisadas(int $idSafra)
    {
        $campos = ['spes.id', 'spes.id_proposta'];
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(['sp' => 'seguro.propostas'], $campos);
        $select->join(['spe' => 'seguro.propostas_endosso'], 'spe.id_endosso = sp.id_endosso AND spe.fl_proposta_vigente is true', false);
        $select->join(['spes' => "{$this->_schema}.{$this->_name}"], 'spes.id_proposta = spe.id_proposta', false);
        $select->join(['pp' => 'produto.produtos'], 'pp.id = sp.id_produto', false);
        $select->join(['ss' => 'sistema.status'], 'ss.id = spes.id_status', false);
        $select->where('pp.id_safra = ?', $idSafra);
        $select->where('ss.ds_chave <> ?', Endosso_Model_Solicitacao::DS_CHAVE_SOLICITACAO_ENDOSSO_NAO_ANALISADO);

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

    /**
     * Retorna se houve alteração em algum dos blocos do endosso informados por parâmetro
     * 
     * @param int $idProposta
     * @param string[] $nomesBlocos
     * @return boolean
     */
    public function possuiAlteracaoNosBlocos(int $idProposta, array $nomesBlocos): bool
	{
		$possuiAlteracao = false;
		$rowSolicitacao = $this->fetchAll(["id_proposta = {$idProposta}"])->current();

		if (!empty($rowSolicitacao) && !empty($rowSolicitacao['ds_campos_alteracoes'])) {
			$camposAlteracoes = json_decode($rowSolicitacao['ds_campos_alteracoes']);
			foreach ($nomesBlocos as $nome) {
				if (array_key_exists($nome, $camposAlteracoes)) {
					$possuiAlteracao = true;
					break;
				}
			}
		}

		return $possuiAlteracao;
	}
}
