<?php
class Seguro_Model_PropostasEmailAssinaturaDocumento extends Agro_Db_Table_Abstract {


    // CREATE TABLE seguro.propostas_email_assinatura_documento (
    //     id SERIAL,
    //     id_proposta INTEGER NOT NULL,
    //     ds_email_segurado VARCHAR,
    //     ds_email_beneficiarios jsonb, -- '[{"id" : 1, "email": "andre.mello@agrobrasilseguros.com.br", "email_instituicao_financeira": "resp@teste.com.br"}]'
    //     CONSTRAINT pk_propostas_email_assinatura_documento PRIMARY KEY(id),
    //     CONSTRAINT fk_propostas_email_assinatura_documento_propostas FOREIGN KEY (id_proposta) REFERENCES seguro.propostas (id)
    // ) INHERITS (public.campos_default);

	protected $_log = true;
	protected $_schema = 'seguro';
	protected $_name = 'propostas_email_assinatura_documento';
    protected $_primary = 'id';

    /**
     * Busca oo responsável da instutição financeira da proposta
     * @param int $idProposta
     * @return Zend_Db_Table_Row
     */
    public function getByProposta($idProposta, $somenteAtivo = false)
    {
        $campoEmailInstituicaoFinanceira = "
            (SELECT 
                distinct arr->>'email_instituicao_financeira' AS email_instituicao_financeira
               FROM seguro.propostas_email_assinatura_documento,
                    jsonb_array_elements(ds_email_beneficiarios) AS arr
              WHERE seguro.propostas_email_assinatura_documento.id = pead.id 
                AND arr->>'email_instituicao_financeira' <> '') AS ds_email_instituicao_financeira
        ";

        $campoBeneficiarioFavorecido = "
            COALESCE(
                (SELECT 1 
                   FROM seguro.propostas_beneficiarios 
                  WHERE id_proposta = pr.id 
                    AND fl_favorecido_autorizacao_credito is true),
                0
            ) AS fl_favorecido_autorizacao_credito";

        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('pead' => 'seguro.propostas_email_assinatura_documento'), "pead.*, {$campoEmailInstituicaoFinanceira}, {$campoBeneficiarioFavorecido}");
        $select->join(array('pr' => 'seguro.propostas'), 'pr.id = pead.id_proposta', null);
        $select->join(array('u' => 'sistema.usuarios'), 'pead.id_usuario_criacao = u.id', 'ds_nome_usuario');
        $select->join(array('spp' => 'seguro.propostas_proponentes'), 'spp.id_proposta = pead.id_proposta', 'ds_nome_proponente');
        $select->join(array('spc' => 'seguro.propostas_corretores'), 'spc.id_proposta = pead.id_proposta', null);
        $select->join(array('sc' => 'sistema.corretores'), 'sc.id_usuario = spc.id_usuario', 'ds_nome_responsavel as ds_nome_corretor, ds_email_responsavel as ds_email_corretor');
        $select->joinLeft(array('pc' => 'seguro.propostas_coberturas'), 'pc.id_proposta = pead.id_proposta AND fl_principal is true', null);
        $select->joinLeft(array('pdc' => 'produto.produtos_coberturas'), 'pdc.id_cobertura = pc.id_cobertura AND pdc.id_produto = pr.id_produto', 'pdc.fl_assinatura_segurado');
        $select->where("pead.id_proposta={$idProposta}");
        
        if ($somenteAtivo) {
            $select->where("pead.fl_ativo is true");
        }
        
        return $this->fetchRow($select);
    }

    public function save($data)
    {
        $Propostas = new Seguro_Model_Propostas();
		$proposta = $Propostas->get($data['id_proposta']);
        
        // Enquanto não for transmitida para a seguradora, pode ficar alterando os e-mails
        $statusPermiteAlteracao = [
            Seguro_Model_Propostas::ID_STATUS_NAO_ENVIADA,
            Seguro_Model_Propostas::ID_STATUS_INCOMPLETA,
            Seguro_Model_Propostas::ID_STATUS_ORCAMENTO_ENDOSSO,
            Seguro_Model_Propostas::ID_STATUS_ENDOSSO_INCOMPLETO,
            Seguro_Model_Propostas::ID_STATUS_DEVOLVIDA,
            Seguro_Model_Propostas::ID_STATUS_SOLICITACAO_ENDOSSO
        ];

        if (in_array($proposta->id_status, $statusPermiteAlteracao)) {
            $Row = $this->getRow($this->getByProposta($data['id_proposta'])->id);
            $data['ds_email_segurado'] = !isset($data['ds_email_segurado']) ? $Row->ds_email_segurado : $data['ds_email_segurado'];
            $data['ds_celular_segurado'] = !isset($data['ds_celular_segurado']) ? $Row->ds_celular_segurado : $data['ds_celular_segurado'];
            $data['ds_email_beneficiarios'] = !isset($data['ds_email_beneficiarios']) ? $Row->ds_email_beneficiarios : $data['ds_email_beneficiarios'];
            $Row->fl_ativo = 'f';
        } else {
            $this->update(array('fl_ativo' => 'f'), "id_proposta = " . $data['id_proposta']);
            $Row = $this->createRow();
            $Row->fl_ativo = 't';
        }

        $Row->id_proposta = $data['id_proposta'];
        $Row->ds_email_segurado = $data['ds_email_segurado'];
        $Row->ds_celular_segurado = $data['ds_celular_segurado'];
        $Row->ds_email_beneficiarios = $data['ds_email_beneficiarios'];
        
        $Row->save();

        return $Row->id;
    }

    public function deleteByProposta($idProposta)
    {
        parent::delete($idProposta, 'id_proposta');
    }

    public function getAssinaturasEndosso($idProposta) {

        $campoEmailInstituicaoFinanceira = "
            (SELECT 
                distinct arr->>'email_instituicao_financeira' AS email_instituicao_financeira
               FROM seguro.propostas_email_assinatura_documento,
                    jsonb_array_elements(ds_email_beneficiarios) AS arr
              WHERE seguro.propostas_email_assinatura_documento.id = p.id 
                AND arr->>'email_instituicao_financeira' <> '') AS ds_email_instituicao_financeira
        ";

        $subQuery = $this->select()
            ->setIntegrityCheck(false)
            ->from('seguro.propostas', 'id_proposta_mae')
            ->where('id = ?', $idProposta);

        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('p' => 'seguro.propostas_email_assinatura_documento'), "p.*, {$campoEmailInstituicaoFinanceira}");
        $select->join(array('prop' => 'seguro.propostas'), 'prop.id = p.id_proposta', 'prop.id_proposta_mae, seguro.nr_endosso(prop.id, prop.id_endosso) as nr_endosso');
        $select->join(array('u' => 'sistema.usuarios'), 'p.id_usuario_criacao = u.id', 'ds_nome_usuario');
        $select->where("prop.id_proposta_mae in ({$subQuery})");
        $select->where("prop.id_status not in (". Seguro_Model_Propostas::ID_STATUS_INCOMPLETA .", " .  Seguro_Model_Propostas::ID_STATUS_NAO_ENVIADA . ", ". Seguro_Model_Propostas::ID_STATUS_ENDOSSO_INCOMPLETO .", ". Seguro_Model_Propostas::ID_STATUS_ORCAMENTO_ENDOSSO . ")");
        $select->order("p.id_proposta DESC, p.id DESC");
        
        return $this->fetchAll($select);
    }

    public function ativarProposta($idProposta) 
    {
        $emailAssinaturaDocumento = $this->getByProposta($idProposta, true);
        if (empty($emailAssinaturaDocumento)) {
            $this->update(array('fl_ativo' => 't'), "id_proposta = " . $idProposta);
        }
    }

    public function add($idProposta, $row) {

        $endossar = new Endosso_Model_Endossar();
        $Proposta = $endossar->find($idProposta)->current();
        $propostaBeneficiarios = $Proposta->beneficiarios();

        
        $emailBeneficiarios = [];
        foreach ($propostaBeneficiarios as $propostaBeneficiario) {

            $email = !empty($propostaBeneficiario['email_assinatura']) ? $propostaBeneficiario['email_assinatura'] :  $propostaBeneficiario['ds_email_beneficiario'];
            $emailInstituicaoFinanceira = !empty($propostaBeneficiario['email_instituicao_financeira_assinatura']) ? $propostaBeneficiario['email_instituicao_financeira_assinatura'] :  $propostaBeneficiario['ds_email_instituicao_financeira'];
            
            $stdBeneficiarioEmail = new stdClass;
            $stdBeneficiarioEmail->id = $propostaBeneficiario['id'];
            $stdBeneficiarioEmail->email = $email;
            $stdBeneficiarioEmail->email_instituicao_financeira = $emailInstituicaoFinanceira;
            $emailBeneficiarios[] = $stdBeneficiarioEmail;

        }

        $data = [
            'id_proposta' => $idProposta,
            'ds_email_segurado' => $row['ds_email_segurado'],
            'ds_celular_segurado' => $row['ds_celular_segurado'],
            'ds_email_beneficiarios' => Zend_Json::encode($emailBeneficiarios)
        ];

		return $this->save($data);
	}

    /**
	 * Valida se o telefone informado é válido (não está informado no corretor e sublogins)
	 * 
	 * @param int $idProposta
	 * @param string $telefone
	 * @return bool
	 */
	public function isTelefoneValido(int $idProposta, string $telefone): bool
	{
        $telefone = preg_replace("/[^0-9]/", "", $telefone);

		$modelPropostas = new Seguro_Model_Propostas();
		$modelCorretores = new Sistema_Model_Corretores();
		$modelTelefones = new Sistema_Model_Telefones();
		$modelContatosAdicionais = new Sistema_Model_ContatosAdicionais();
		
		$telefonesCorretor = [];
		$Proposta = $modelPropostas->find($idProposta)->current();
		$corretor = $Proposta->corretor();

		$prepostos = $modelCorretores->getPrepostos($corretor['id']); 

		if (!empty($corretor['ds_telefone_contato_seguro_agricola'])) {
            $telefonesCorretor[] = preg_replace("/[^0-9]/", "", $corretor['ds_telefone_contato_seguro_agricola']);
		}

		if (!empty($corretor['ds_telefone_responsavel'])) {
			$telefonesCorretor[] = preg_replace("/[^0-9]/", "", $corretor['ds_telefone_responsavel']);
		}

		foreach ($prepostos as $preposto) {
			$telefonesUsuario = $modelTelefones->getTelefoneUsuario($preposto['id_usuario']);
			foreach ($telefonesUsuario as $telefoneUsuario) {
				$telefonesCorretor[] = preg_replace("/[^0-9]/", "", $telefoneUsuario['ds_numero']);
			}

			$sql = $modelContatosAdicionais->getData("id_usuario = {$preposto['id_usuario']} AND ds_telefone <> ''");
			$telefonesContatoAdicionais = $modelContatosAdicionais->fetchAll($sql);
			foreach ($telefonesContatoAdicionais as $telefoneContatoAdicional) {
                $telefonesCorretor[] = preg_replace("/[^0-9]/", "", $telefoneContatoAdicional['ds_telefone']);
			}
		}

		return !in_array($telefone, $telefonesCorretor);
	}
}
