<?php

use DocuSign\eSign\Model\SignHere;
use DocuSign\eSign\Model\Tabs;
use DocuSign\eSign\Model\DateSigned;
use DocuSign\eSign\Model\InitialHere;
use DocuSign\eSign\Model\RecipientEmailNotification;
use DocuSign\eSign\Model\Text;

class Seguro_Model_PropostasDocusign extends Agro_DocuSign_Base
{
    protected $_log = true;
    protected $_schema = 'seguro';
    protected $_name = 'propostas_docusign';
    protected $_primary = 'id';
    private $_seguradoRecipientEmailNotification = null;
    private $_corretorRecipientEmailNotification = null;
    private $_respFinanceiroRecipientEmailNotification = null;
    private $_idProposta = null;
    private $_idPropostaCompleto = null;

    const TIPO_PROPOSTA = 'P';
    const TIPO_ENDOSSO = 'E';
    const TIPO_RECUSA_PROPOSTA = 'R';
    const TIPO_CANCELAMENTO_APOLICE = 'C';

    const ROLE_NAME_SEGURADO = 'Segurado';
    const ROLE_NAME_CORRETOR = 'Corretor';
    const ROLE_NAME_RESPONSAVEL_FINANCEIRO = 'Responsável da Instituição Financeira';

    public function isAssinaturaFinalizada(int $idProposta): bool
    {
        $rs = $this->fetchAll(
            $this->select()
                ->setIntegrityCheck(false)
                ->from(['spd' => 'seguro.propostas_docusign'], 'id')
                ->where('id_proposta = ?', $idProposta)
                ->where("ds_status = 'completed'")
                ->where('fl_ativo IS TRUE')
        );

        return $rs->count() > 0;
    }

    /**
     * Busca o vínculo da proposta com a docusign (id_envelope)
     * @param int $idProposta
     * @return Zend_Db_Table_Row
     */
    public function getByProposta($idProposta, $somenteAtivo = true)
    {
        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('pd' => 'seguro.propostas_docusign'), '*');
        $select->join(array('u' => 'sistema.usuarios'), 'pd.id_usuario_criacao = u.id', 'ds_nome_usuario');
        $select->where("pd.id_proposta={$idProposta}");

        if ($somenteAtivo) {
            $select->where("pd.fl_ativo is true");
        }

        $select->order('pd.id DESC');

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

    /**
     * Desativa todos os registros anteriores da proposta informada e inclui um novo ativo.
     *
     * @param mixed $data [
     *  'id_proposta' => '',
     *  'id_envelope' => '',
     *  'ds_status' => '',
     *  'id_proposta_email_assinatura_documento' => '',
     *  'st_tipo_envio' => '',
     *  'ds_mensagem' => ''
     * ]
     * @return int
     */
    public function save($data): int
    {
        $this->update(array('fl_ativo' => 'f'), "id_proposta = " . $data['id_proposta']);

        $row = $this->createRow();
        $row->id_proposta = $data['id_proposta'];
        $row->id_envelope = $data['id_envelope'];
        $row->ds_status = $data['ds_status'];
        $row->id_proposta_email_assinatura_documento = $data['id_proposta_email_assinatura_documento'];
        $row->st_tipo_envio = $data['st_tipo_envio'];
        $row->ds_mensagem = $data['ds_mensagem'];
        $row->save();

        return $row->id;
    }

    /**
     * Deleta todos os registros de uma proposta
     *
     * @param int $idProposta
     */
    public function deleteByProposta($idProposta): void
    {
        parent::delete($idProposta, 'id_proposta');
    }

    /**
     * Adiciona a proposta informada no parâmetro a fila de envio para a docusign com o status de 'waiting'.
     * Caso não tenha AT agendado para o processamento da fila de envios (verifica se tem at especificado com a letra 'd'), cria um novo AT.
     *
     * @param int $idProposta
     * @param string $tipoEnvio
     */
    public function adicionarFila(int $idProposta, string $tipoEnvio): void
    {
        $propostasEmailAssinaturaDocumento = new Seguro_Model_PropostasEmailAssinaturaDocumento();
        $dadosAssinatura = $propostasEmailAssinaturaDocumento->getByProposta($idProposta, true);

        if (!empty($dadosAssinatura)) {
            $data = [
                'id_proposta' => $idProposta,
                'id_envelope' => '',
                'id_proposta_email_assinatura_documento' => $dadosAssinatura['id'],
                'ds_status' => Seguro_Model_PropostasDocusign::STATUS_WAITING,
                'st_tipo_envio' => $tipoEnvio
            ];
            $retorno = $this->save($data);

            if (empty($retorno)) {
                throw new Exception("Erro ao adicionar a proposta na lista de envio.");
            }

            if (!Agro_Util::hasAtByLetter('d')) {
                Agro_Util::generateAtscript("processarfiladocusign.php", array(), '', 'd');
            }
        }
    }

    /**
     * Busca os registros ativos com os status informados no parâmetro
     *
     * @param string[] $status
     * @return array
     */
    public function getFila(array $status): array
    {
        $whereStatus = [];
        foreach ($status as $dsStatus) {
            $whereStatus[] = "'{$dsStatus}'";
        }

        $select = $this->select()->setIntegrityCheck(false);
        $select->from(array('pd' => 'seguro.propostas_docusign'), '*');
        $select->where("pd.fl_ativo is true");
        $select->where("pd.ds_status in (" . implode(', ', $whereStatus) . ")");
        $select->order('pd.id');

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

    /**
     * Verifica se houve alteração do status na docusign e cria um novo registro caso haja.
     * Retorna o atual status que o envelope está na docusign.
     *
     * @param mixed $propostaDocusign [
     *  'id_proposta' => '',
     *  'id_envelope' => '',
     *  'ds_status' => '',
     *  'id_proposta_email_assinatura_documento' => '',
     *  'st_tipo_envio' => '',
     *  'ds_mensagem' => ''
     * ]
     * @return string
     */
    public function atualizarStatusEnvelope(array $propostaDocusign): string
    {
        $dadosEnvelope = $this->buscarStatusEnvelope($propostaDocusign['id_envelope'], $propostaDocusign['ds_status']);

        if ($dadosEnvelope['ds_status'] != $propostaDocusign['ds_status']) {
            
            $propostaDocusign['ds_status'] = $dadosEnvelope['ds_status'];
            $propostaDocusign['ds_mensagem'] = $dadosEnvelope['ds_mensagem'];
            $this->save($propostaDocusign);
        }

        return $propostaDocusign['ds_status'];
    }

    /**
     * Busca todos os documentos de um envelope da docusign pela proposta informanda
     *
     * @param int $idProposta
     * @return SplFileObject[]|array
     */
    public function getDocumentoByProposta(int $idProposta): array
    {
        $propostaDocusign = $this->getByProposta($idProposta);

        if (empty($propostaDocusign)) {
            throw new Exception("Nenhum envio encontrado para a proposta informada.");
        }
        
        if (empty($propostaDocusign[0]['id_envelope'])) {
            throw new Exception("Nenhum envelope encontrado para a proposta informada.");
        }

        $emailCompositeTemplates = new Agro_DocuSign_EmailCompositeTemplates();
        $idEnvelope = $propostaDocusign[0]['id_envelope'];
        $documentos = $emailCompositeTemplates->getAllDocumentos($idEnvelope);

        if (empty($documentos)) {
            throw new Exception("Nenhum documento encontrado para a proposta informada.");
        }

        return $documentos;
    }

    /**
     * Envia o PDF e os templates (de acordo com as regras) da proposta informada por parâmetro para os e-mails que estão configuradas para a mesma.
     *
     * @param int $idProposta
     */
    public function enviarOrcamento(int $idProposta): void
    {
        $modelPropostasTipoAssinaturaDocumento = new Seguro_Model_PropostasTipoAssinaturaDocumento();
        $tipoAssinaturaDocumento = $modelPropostasTipoAssinaturaDocumento->getByProposta($idProposta);
        $tiposValidos = [Seguro_Model_PropostasTipoAssinaturaDocumento::ELETRONICA_EMAIL, Seguro_Model_PropostasTipoAssinaturaDocumento::ELETRONICA_SMS];

        if (count($tipoAssinaturaDocumento) > 0 && in_array($tipoAssinaturaDocumento[0]['tipo_assinatura'], $tiposValidos)) {
           
            $propostasEmailAssinaturaDocumento = new Seguro_Model_PropostasEmailAssinaturaDocumento();
            $emailCompositeTemplates = new Agro_DocuSign_EmailCompositeTemplates();
            $propostasQuestionarios = new Seguro_Model_PropostasQuestionarios();
            $modelPropostas = new Seguro_Model_Propostas();
            
            $emailCompositeTemplates->setTipoAssinatura($tipoAssinaturaDocumento[0]['tipo_assinatura']);
            $proposta = $modelPropostas->find($idProposta)->current();
            $produto = $proposta->produto();

            $this->_idProposta = $idProposta;
            $this->_idPropostaCompleto = $proposta->doc();
            $this->_idPropostaCompleto = str_replace(".", "", $this->_idPropostaCompleto);
            $this->_idPropostaCompleto = str_replace("-", "", $this->_idPropostaCompleto);
            
            $dadosAssinatura = $propostasEmailAssinaturaDocumento->getByProposta($idProposta, true)->toArray();

            if (empty($dadosAssinatura['ds_nome_corretor'])) {
                throw new Exception("Nome do responsável técnico da corretora não informado.");
            }

            if (empty($dadosAssinatura['ds_email_corretor'])) {
                throw new Exception("E-mail do responsável técnico da corretora não informado.");
            }

            if ($tipoAssinaturaDocumento[0]['tipo_assinatura'] == Seguro_Model_PropostasTipoAssinaturaDocumento::ELETRONICA_SMS &&
                empty($dadosAssinatura['ds_celular_segurado'])) {
                throw new Exception("Telefone celular do segurado não informado.");
            }

            if (!empty($dadosAssinatura['ds_email_beneficiarios'])) {
                $dadosAssinatura['ds_email_beneficiarios'] = Zend_Json::decode($dadosAssinatura['ds_email_beneficiarios']);
            }

            if (!empty($dadosAssinatura['ds_email_instituicao_financeira'])) {
                $row = current((new Seguro_Model_PropostasBeneficiarios())->getBeneficiarios($idProposta, ["ds_email_instituicao_financeira <> ''"]));
                $dadosAssinatura['ds_nome_beneficiario'] = $row['ds_nome_beneficiarios'];
            }

            $this->alterarEmailsAmbienteDev($dadosAssinatura);
            $this->addDocumentoProposta($emailCompositeTemplates, $dadosAssinatura, $produto['ds_url_condicoes']);
            
            $respostasQuestionario = $propostasQuestionarios->getRespostas($idProposta);

            if (isset($respostasQuestionario['QUEST_SUBVENCAO_FEDERAL']) && $respostasQuestionario['QUEST_SUBVENCAO_FEDERAL'] == 1) {
                $this->addTemplateTermoFederal($emailCompositeTemplates, $dadosAssinatura);
            }

            if (isset($respostasQuestionario['QUEST_SUBVENCAO_ESTADUAL']) && $respostasQuestionario['QUEST_SUBVENCAO_ESTADUAL'] == 1) {

                $siglaEstado = $proposta->propriedade('ds_sigla');
                if ($siglaEstado == 'PR') {
                    $this->addTemplateTermoEstadualPR($emailCompositeTemplates, $dadosAssinatura);
                } else if ($siglaEstado == 'SP') {
                    $this->addTemplateTermoEstadualSP($emailCompositeTemplates, $dadosAssinatura);
                }
            }

            $rowInformacoesBancariasPropostas = (new Seguro_Model_InformacoesBancariasPropostas())->fetchAll(["id_proposta = {$idProposta}"])->current();
            if (!empty($rowInformacoesBancariasPropostas)) {
                if ($rowInformacoesBancariasPropostas['fl_titular_conta']) {
                    $this->addTemplateTermoDadosBancariosSegurado($emailCompositeTemplates, $dadosAssinatura);
                } else {
                    $this->addTemplateTermoDadosBancariosSeguradoOrdemPagamento($emailCompositeTemplates, $dadosAssinatura);
                }
                
            }
            
            if ($dadosAssinatura['fl_favorecido_autorizacao_credito']) {
                $this->addTemplateTermoDadosBancariosBeneficiario($emailCompositeTemplates, $dadosAssinatura);
            }

            /**
             * Defino o título geral para o envelope aqui, para quando não houver configurado nenhum título específico para as roles (Segurado, Corretor e/ou Responsável Financeiro).
             * Além disso, quando envelope é assinado por todos os envolvido, o e-mail que é retornado para o download dos documentos utiliza desse título.
             */
            if ($emailCompositeTemplates->getTipoAssinatura() == Seguro_Model_PropostasTipoAssinaturaDocumento::ELETRONICA_SMS && !empty($this->_seguradoRecipientEmailNotification)){
                
                $emailCompositeTemplates->setEmailSubject($this->_seguradoRecipientEmailNotification->getEmailSubject());
                $emailCompositeTemplates->setEmailBlurb($this->_seguradoRecipientEmailNotification->getEmailBody());
            } else {
                
                $emailCompositeTemplates->setEmailSubject("Proposta de Seguro Agrícola N° {$this->_idPropostaCompleto} ($this->_idProposta)");
                $emailCompositeTemplates->setEmailBlurb("Prezado(a),

                Você está recebendo o link para assinatura da proposta {$this->_idPropostaCompleto} ($this->_idProposta) e seus anexos. Para acessar o documento, clique em 'Analisar documento'. 
                Em caso de dúvidas entrar em contato com: (51) 3383-5100 RAMAL: 5002
                
                Grato,");
            }

            $emailCompositeTemplates->setBrandId("da32bc40-3fc3-4f8d-8b72-75944543fcea");

            $idEnvelope = $emailCompositeTemplates->enviar(true);
            $data['id_proposta'] = $idProposta;
            $data['id_envelope'] = $idEnvelope;
            $data['id_proposta_email_assinatura_documento'] = $dadosAssinatura['id'];
            $data['st_tipo_envio'] = self::TIPO_PROPOSTA;
            $data['ds_status'] = Seguro_Model_PropostasDocusign::STATUS_SENT;
            $this->save($data);
        }
    }

    /**
     * Altera os e-mails configurados para envio no caso de estar em ambiente dev, para evitar enviar e-mails para as pessoas erradas.
     * Caso esteja logado com um usuário Agro, altera para o e-mail que está configurado para o mesmo, senão, coloca o e-mail da TI.
     *
     * @param mixed[] $dadosAssinatura [
     *  'ds_nome_proponente' => '',
     *  'ds_email_segurado' => '',
     *  'ds_nome_corretor' => '',
     *  'ds_email_corretor' => '',
     *  'ds_nome_beneficiario' => '',
     *  'ds_email_instituicao_financeira' => '',
     *  'ds_email_beneficiarios' => []
     * ]
     */
    private function alterarEmailsAmbienteDev(&$dadosAssinatura): void
    {
        if (APPLICATION_ENV != 'production') {
            $email = DOCUSIGN_EMAIL_TESTE;
            $sms = DOCUSIGN_SMS_TESTE;

            $dadosAssinatura['ds_nome_proponente'] = 'Segurado';
            $dadosAssinatura['ds_email_segurado'] = $email;
            $dadosAssinatura['ds_celular_segurado'] = $sms;
            $dadosAssinatura['ds_nome_corretor'] = 'Corretor';
            $dadosAssinatura['ds_email_corretor'] = $email;

            if (!empty($dadosAssinatura['ds_nome_beneficiario'])) {
                $dadosAssinatura['ds_nome_beneficiario'] = 'Financeiro';
                $dadosAssinatura['ds_email_instituicao_financeira'] = $email;
            }

            $beneficiarios = [];
            foreach ($dadosAssinatura['ds_email_beneficiarios'] as $value) {
                $beneficiarios[] = ['id' => $value['id'], 'email' => $email];
            }
            $dadosAssinatura['ds_email_beneficiarios'] = $beneficiarios;
        }
    }

    /**
     * Adiciona o PDF da proposta e o campos de assinatura e rubrica na composição de templates.
     *
     * @param Agro_DocuSign_EmailCompositeTemplates $emailCompositeTemplates
     * @param array $dadosAssinatura [
     *  'ds_nome_proponente' => '',
     *  'ds_email_segurado' => '',
     *  'ds_celular_segurado' => '',
     *  'ds_nome_corretor' => '',
     *  'ds_email_corretor' => ''
     * ]
     * @param string $urlCondicoes
     */
    private function addDocumentoProposta(Agro_DocuSign_EmailCompositeTemplates &$emailCompositeTemplates, array $dadosAssinatura, string $urlCondicoes): void
    {
        $path = APPLICATION_PATH . '/upload_files/proposta_tipo_assinatura/';
        $nomePdf = $this->_idProposta . '_termo.pdf';
        $diretorioDoc = $path . $nomePdf;

        if (!file_exists($diretorioDoc)){
            throw new Exception("Não foi encontrado o arquivo PDF do orçamento da proposta.");
        }

        $data = new stdClass();
        $data->tipo = Agro_DocuSign_EmailCompositeTemplates::TIPO_DOCUMENTO;

        $signHereProponente = new SignHere();
        $signHereProponente->setAnchorString("assinatura_do_proponente");
        $signHereProponente->setAnchorYOffset(20);
        $signHereProponente->setAnchorXOffset(20);
        $signHereProponente->setAnchorUnits('pixels');

        $signHereCorretor = new SignHere();
        $signHereCorretor->setAnchorString("assinatura_do_corretor");
        $signHereCorretor->setAnchorYOffset(20);
        $signHereCorretor->setAnchorXOffset(20);
        $signHereCorretor->setAnchorUnits('pixels');

        $dateSigned = new DateSigned();
        $dateSigned->setAnchorString('data_assinatura');
        $dateSigned->setAnchorYOffset(5);
        $dateSigned->setAnchorUnits('pixels');

        $textTabCpfCorretor = new Text();
        $textTabCpfCorretor->setAnchorString('cpf_do_corretor');
        $textTabCpfCorretor->setWidth(100);
        $textTabCpfCorretor->setAnchorUnits('pixels');
        $textTabCpfCorretor->setDisableAutoSize(true);
        $textTabCpfCorretor->setMaxLength(14);
        $textTabCpfCorretor->setAnchorXOffset($textTabCpfCorretor->getAnchorXOffset() - 5);
        $textTabCpfCorretor->setAnchorYOffset($textTabCpfCorretor->getAnchorYOffset() - 5);

        $textUrlCondicoes = new Text();
        $textUrlCondicoes->setAnchorString('ds_url_condicoes');
        $textUrlCondicoes->setTabLabel("#HREF_ds_url_condicoes");
        $textUrlCondicoes->setName($urlCondicoes);
        $textUrlCondicoes->setValue($urlCondicoes);
        $textUrlCondicoes->setTooltip($urlCondicoes);
        $textUrlCondicoes->setWidth(255);
        $textUrlCondicoes->setLocked(true);
        $textUrlCondicoes->setFontSize('Size7');
        $textUrlCondicoes->setAnchorXOffset($textUrlCondicoes->getAnchorXOffset() - 5);
        $textUrlCondicoes->setAnchorYOffset($textUrlCondicoes->getAnchorYOffset() - 2);

        $data->signers[] = (object) [
            'name' => $dadosAssinatura['ds_nome_proponente'],
            'email' => $dadosAssinatura['ds_email_segurado'],
            'number' => $dadosAssinatura['ds_celular_segurado'],
            'roleName' => self::ROLE_NAME_SEGURADO,
            'tabs' => new Tabs([
                'date_signed_tabs' => [$dateSigned],
                'sign_here_tabs' => [$signHereProponente],
                'text_tabs' => [$textUrlCondicoes]
            ]),
            'emailNotification' => $this->getRecipientEmailNotificationByRole(self::ROLE_NAME_SEGURADO, $emailCompositeTemplates->getTipoAssinatura())
        ];

        $data->signers[] = (object) [
            'name' => $dadosAssinatura['ds_nome_corretor'],
            'email' => $dadosAssinatura['ds_email_corretor'],
            'roleName' => self::ROLE_NAME_CORRETOR,
            'tabs' => new Tabs([
                'sign_here_tabs' => [$signHereCorretor],
                'text_tabs' => [$textTabCpfCorretor, $textUrlCondicoes]
            ]),
            'emailNotification' => $this->getRecipientEmailNotificationByRole(self::ROLE_NAME_CORRETOR)
        ];

        $data->document = (object) ['dir' => $diretorioDoc, 'name' => "{$this->_idProposta} - Proposta", 'id' => '1'];
        $emailCompositeTemplates->add($data);
    }

    /**
     * Adiciona o template do termo federal na composição de templates.
     *
     * @param Agro_DocuSign_EmailCompositeTemplates $emailCompositeTemplates
     * @param mixed[] $dadosAssinatura [
     *  'ds_nome_proponente' => '',
     *  'ds_email_segurado' => '',
     *  'ds_celular_segurado' => '',
     *  'ds_nome_beneficiario' => '',
     *  'ds_email_instituicao_financeira' => ''
     * ]
     */
    private function addTemplateTermoFederal(Agro_DocuSign_EmailCompositeTemplates &$emailCompositeTemplates, $dadosAssinatura): void
    {
        $idTipoAssinatura = $emailCompositeTemplates->getTipoAssinatura();

        if ($idTipoAssinatura == Seguro_Model_PropostasTipoAssinaturaDocumento::ELETRONICA_EMAIL && empty($dadosAssinatura['ds_email_segurado'])) {
            throw new Exception("Não foi possível realizar o envio dos documentos. E-mail do segurado não informado para o Termo Federal.");
        }

        if ($idTipoAssinatura == Seguro_Model_PropostasTipoAssinaturaDocumento::ELETRONICA_SMS && empty($dadosAssinatura['ds_celular_segurado'])) {
            throw new Exception("Não foi possível realizar o envio dos documentos. Telefone do segurado não informado para o Termo Federal.");
        }

        $data = new stdClass();
        $data->tipo = Agro_DocuSign_EmailCompositeTemplates::TIPO_TEMPLATE;
        $data->tipoTemplate = Agro_DocuSign_TemplateFactory::TERMO_SUB_FEDERAL_SEM_FINANCIAMENTO;
        $data->parametros = ['id_proposta' => $this->_idProposta];
        $data->signers = array();

        $data->signers[] = (object) [
            'name' => $dadosAssinatura['ds_nome_proponente'],
            'email' => $dadosAssinatura['ds_email_segurado'],
            'number' => $dadosAssinatura['ds_celular_segurado'],
            'roleName' => self::ROLE_NAME_SEGURADO,
            'emailNotification' => $this->getRecipientEmailNotificationByRole(self::ROLE_NAME_SEGURADO, $idTipoAssinatura)
        ];

        if (!empty($dadosAssinatura['ds_nome_beneficiario']) && !empty($dadosAssinatura['ds_email_instituicao_financeira'])) {
            $data->tipoTemplate = Agro_DocuSign_TemplateFactory::TERMO_SUB_FEDERAL_COM_FINANCIAMENTO;
            $data->signers[] = (object) [
                'name' => $dadosAssinatura['ds_nome_beneficiario'],
                'email' => $dadosAssinatura['ds_email_instituicao_financeira'],
                'roleName' => self::ROLE_NAME_RESPONSAVEL_FINANCEIRO,
                'emailNotification' => $this->getRecipientEmailNotificationByRole(self::ROLE_NAME_RESPONSAVEL_FINANCEIRO)
            ];
        }

        $emailCompositeTemplates->add($data);
    }

    /**
     * Adiciona o template do termo estadual de PR na composição de templates.
     *
     * @param Agro_DocuSign_EmailCompositeTemplates $emailCompositeTemplates
     * @param mixed[] $dadosAssinatura [
     *  'ds_nome_proponente' => '',
     *  'ds_email_segurado' => '',
     *  'ds_celular_segurado' => '',
     * ]
     */
    private function addTemplateTermoEstadualPR(Agro_DocuSign_EmailCompositeTemplates &$emailCompositeTemplates, $dadosAssinatura): void
    {
        $data = new stdClass();
        $data->tipo = Agro_DocuSign_EmailCompositeTemplates::TIPO_TEMPLATE;
        $data->signers = [
            (object) [
                'name' => $dadosAssinatura['ds_nome_proponente'],
                'email' => $dadosAssinatura['ds_email_segurado'],
                'number' => $dadosAssinatura['ds_celular_segurado'],
                'roleName' => self::ROLE_NAME_SEGURADO,
                'emailNotification' => $this->getRecipientEmailNotificationByRole(self::ROLE_NAME_SEGURADO, $emailCompositeTemplates->getTipoAssinatura())
            ],
        ];

        $data->tipoTemplate = Agro_DocuSign_TemplateFactory::TERMO_SUB_PR;
        $data->parametros = ['id_proposta' => $this->_idProposta];
        $emailCompositeTemplates->add($data);
    }

    /**
     * Adiciona o template do termo estadual de SP na composição de templates.
     *
     * @param Agro_DocuSign_EmailCompositeTemplates $emailCompositeTemplates
     * @param mixed[] $dadosAssinatura [
     *  'ds_nome_proponente' => '',
     *  'ds_email_segurado' => '',
     *  'ds_celular_segurado' => '',
     *  'ds_nome_corretor' => '',
     *  'ds_email_corretor' => ''
     * ]
     */
    private function addTemplateTermoEstadualSP(Agro_DocuSign_EmailCompositeTemplates &$emailCompositeTemplates, $dadosAssinatura): void
    {
        $data = new stdClass();
        $data->tipo = Agro_DocuSign_EmailCompositeTemplates::TIPO_TEMPLATE;
        $data->signers = [
            (object) [
                'name' => $dadosAssinatura['ds_nome_proponente'], 
                'email' => $dadosAssinatura['ds_email_segurado'],
                'number' => $dadosAssinatura['ds_celular_segurado'],
                'roleName' => self::ROLE_NAME_SEGURADO,
                'emailNotification' => $this->getRecipientEmailNotificationByRole(self::ROLE_NAME_SEGURADO, $emailCompositeTemplates->getTipoAssinatura())
            ],
            (object) [
                'name' => $dadosAssinatura['ds_nome_corretor'],
                'email' => $dadosAssinatura['ds_email_corretor'],
                'roleName' => self::ROLE_NAME_CORRETOR,
                'emailNotification' => $this->getRecipientEmailNotificationByRole(self::ROLE_NAME_CORRETOR)
            ],
        ];
        $data->tipoTemplate = Agro_DocuSign_TemplateFactory::TERMO_SUB_SP;
        $data->parametros = ['id_proposta' => $this->_idProposta];
        $emailCompositeTemplates->add($data);
    }

    /**
     * Adiciona o template dos dados bancários do segurado na composição de templates.
     *
     * @param Agro_DocuSign_EmailCompositeTemplates $emailCompositeTemplates
     * @param mixed[] $dadosAssinatura [
     *  'ds_nome_proponente' => '',
     *  'ds_email_segurado' => '',
     *  'ds_celular_segurado' => '',
     * ]
     */
    private function addTemplateTermoDadosBancariosSegurado(Agro_DocuSign_EmailCompositeTemplates &$emailCompositeTemplates, $dadosAssinatura): void
    {
        $data = new stdClass();
        $data->tipo = Agro_DocuSign_EmailCompositeTemplates::TIPO_TEMPLATE;
        $data->signers = [
            (object) [
                'name' => $dadosAssinatura['ds_nome_proponente'],
                'email' => $dadosAssinatura['ds_email_segurado'],
                'number' => $dadosAssinatura['ds_celular_segurado'],
                'roleName' => self::ROLE_NAME_SEGURADO,
                'emailNotification' => $this->getRecipientEmailNotificationByRole(self::ROLE_NAME_SEGURADO, $emailCompositeTemplates->getTipoAssinatura())
            ],
        ];
        $data->tipoTemplate = Agro_DocuSign_TemplateFactory::TERMO_DADOS_BANCARIOS_SEGURADO;
        $data->parametros = ['id_proposta' => $this->_idProposta];
        $emailCompositeTemplates->add($data);
    }

    /**
     * Adiciona o template dos dados bancários do segurado com ordem de pagamento na composição de templates.
     *
     * @param Agro_DocuSign_EmailCompositeTemplates $emailCompositeTemplates
     * @param mixed[] $dadosAssinatura [
     *  'ds_nome_proponente' => '',
     *  'ds_email_segurado' => '',
     *  'ds_celular_segurado' => '',
     * ]
     */
    private function addTemplateTermoDadosBancariosSeguradoOrdemPagamento(Agro_DocuSign_EmailCompositeTemplates &$emailCompositeTemplates, $dadosAssinatura): void
    {
        $data = new stdClass();
        $data->tipo = Agro_DocuSign_EmailCompositeTemplates::TIPO_TEMPLATE;
        $data->signers = [
            (object) [
                'name' => $dadosAssinatura['ds_nome_proponente'],
                'email' => $dadosAssinatura['ds_email_segurado'],
                'number' => $dadosAssinatura['ds_celular_segurado'],
                'roleName' => self::ROLE_NAME_SEGURADO,
                'emailNotification' => $this->getRecipientEmailNotificationByRole(self::ROLE_NAME_SEGURADO, $emailCompositeTemplates->getTipoAssinatura())
            ],
        ];
        $data->tipoTemplate = Agro_DocuSign_TemplateFactory::TERMO_DADOS_BANCARIOS_SEGURADO_ORDEM_PAGAMENTO;
        $data->parametros = ['id_proposta' => $this->_idProposta];
        $emailCompositeTemplates->add($data);
    }

    /**
     * Adiciona o template dos dados bancários do beneficiário na composição de templates.
     *
     * @param Agro_DocuSign_EmailCompositeTemplates $emailCompositeTemplates
     * @param mixed[] $dadosAssinatura [
     *  'ds_nome_proponente' => '',
     *  'ds_email_segurado' => '',
     *  'ds_celular_segurado' => '',
     * ]
     */
    private function addTemplateTermoDadosBancariosBeneficiario(Agro_DocuSign_EmailCompositeTemplates &$emailCompositeTemplates, $dadosAssinatura): void
    {
        $data = new stdClass();
        $data->tipo = Agro_DocuSign_EmailCompositeTemplates::TIPO_TEMPLATE;
        $data->signers = [
            (object) [
                'name' => $dadosAssinatura['ds_nome_proponente'],
                'email' => $dadosAssinatura['ds_email_segurado'],
                'number' => $dadosAssinatura['ds_celular_segurado'],
                'roleName' => self::ROLE_NAME_SEGURADO,
                'emailNotification' => $this->getRecipientEmailNotificationByRole(self::ROLE_NAME_SEGURADO, $emailCompositeTemplates->getTipoAssinatura())
            ]
        ];
        $data->tipoTemplate = Agro_DocuSign_TemplateFactory::TERMO_DADOS_BANCARIOS_BENEFICIARIO;
        $data->parametros = ['id_proposta' => $this->_idProposta];
        $emailCompositeTemplates->add($data);
    }

    /**
     * Retorna a descrição do tipo informado no parâmetro
     *
     * @param string|null $tipoEnvio
     * @return string
     */
    public static function getDescricaoByTipo(?string $tipoEnvio): string
    {
        switch ($tipoEnvio) {
            case self::TIPO_PROPOSTA:
                $descricao = 'PROPOSTA';
                break;
            case self::TIPO_ENDOSSO:
                $descricao = 'ENDOSSO';
                break;
            case self::TIPO_RECUSA_PROPOSTA:
                $descricao = 'RECUSA PROPOSTA';
                break;
            case self::TIPO_CANCELAMENTO_APOLICE:
                $descricao = 'CANCELAMENTO APÓLICE';
                break;
            default:
                $descricao = "NÃO INFORMADA";
                break;
        }
    
        return $descricao;
    }

    /**
     * Define um título e corpo de e-mail específico para a role informada.
     *
     * @param string $roleName
     * @return RecipientEmailNotification|null
     */
    private function getRecipientEmailNotificationByRole(string $roleName, ?int $tipoAssinatura = null): ?RecipientEmailNotification
    {
        switch ($roleName) {
            case self::ROLE_NAME_SEGURADO:

                if ($this->_seguradoRecipientEmailNotification == null) {

                    switch ($tipoAssinatura) {
                        case Seguro_Model_PropostasTipoAssinaturaDocumento::ELETRONICA_SMS:
                            if (!empty(DOCUSIGN_TITULO_SMS_SEGURADO) && !empty(DOCUSIGN_CORPO_SMS_SEGURADO)) {
                                $this->personalizarSMSSegurado();
                            }
                            break;
                        
                        case Seguro_Model_PropostasTipoAssinaturaDocumento::ELETRONICA_EMAIL:
                            if (!empty(DOCUSIGN_TITULO_EMAIL_SEGURADO) && !empty(DOCUSIGN_CORPO_EMAIL_SEGURADO)) {
                                $this->personalizarEmailSegurado();
                            }
                            break;
                    }
                }

                return $this->_seguradoRecipientEmailNotification;
                break;
            case self::ROLE_NAME_CORRETOR:
                if ($this->_corretorRecipientEmailNotification == null && !empty(DOCUSIGN_TITULO_EMAIL_CORRETOR) && !empty(DOCUSIGN_CORPO_EMAIL_CORRETOR)) {
                    $this->personalizarEmailCorretor();
                }

                return $this->_corretorRecipientEmailNotification;
                break;
            case self::ROLE_NAME_RESPONSAVEL_FINANCEIRO:
                if ($this->_respFinanceiroRecipientEmailNotification == null && !empty(DOCUSIGN_TITULO_EMAIL_RESP_FINANCEIRO) && !empty(DOCUSIGN_CORPO_EMAIL_RESP_FINANCEIRO)) {
                    $this->personalizarEmailResponsavelFinanceiro();
                }

                return $this->_respFinanceiroRecipientEmailNotification;
                break;
        }

        return null;
    }

    private function personalizarSMSSegurado(): void
    {
        $titulo = DOCUSIGN_TITULO_SMS_SEGURADO;
        $titulo = str_replace("[id_proposta_completa]", $this->_idPropostaCompleto, $titulo);
        $titulo = str_replace("[id_proposta]", $this->_idProposta, $titulo);
        
        $corpo = DOCUSIGN_CORPO_SMS_SEGURADO;
        $corpo = str_replace("[id_proposta_completa]", $this->_idPropostaCompleto, $corpo);
        $corpo = str_replace("[id_proposta]", $this->_idProposta, $corpo);
        $corpo = str_replace("[contato]", '(51) 3383-5100 RAMAL: 5002', $corpo);

        $this->_seguradoRecipientEmailNotification = new RecipientEmailNotification();
        $this->_seguradoRecipientEmailNotification->setEmailSubject($titulo);
        $this->_seguradoRecipientEmailNotification->setEmailBody($corpo);
    }

    /**
     * Define o título e corpo do e-mail do Segurado
     */
    private function personalizarEmailSegurado(): void
    {
        $titulo = DOCUSIGN_TITULO_EMAIL_SEGURADO;
        $titulo = str_replace("[id_proposta_completa]", $this->_idPropostaCompleto, $titulo);
        $titulo = str_replace("[id_proposta]", $this->_idProposta, $titulo);
        
        $corpo = DOCUSIGN_CORPO_EMAIL_SEGURADO;
        $corpo = str_replace("[id_proposta_completa]", $this->_idPropostaCompleto, $corpo);
        $corpo = str_replace("[id_proposta]", $this->_idProposta, $corpo);
        $corpo = str_replace("[contato]", '(51) 3383-5100 RAMAL: 5002', $corpo);
        
        $this->_seguradoRecipientEmailNotification = new RecipientEmailNotification();
        $this->_seguradoRecipientEmailNotification->setEmailSubject($titulo);
        $this->_seguradoRecipientEmailNotification->setEmailBody($corpo);
    }

    /**
     * Define o título e corpo do e-mail do Corretor
     */
    private function personalizarEmailCorretor(): void
    {
        $titulo = DOCUSIGN_TITULO_EMAIL_CORRETOR;
        $titulo = str_replace("[id_proposta_completa]", $this->_idPropostaCompleto, $titulo);
        $titulo = str_replace("[id_proposta]", $this->_idProposta, $titulo);
        
        $corpo = DOCUSIGN_CORPO_EMAIL_CORRETOR;
        $corpo = str_replace("[id_proposta_completa]", $this->_idPropostaCompleto, $corpo);
        $corpo = str_replace("[id_proposta]", $this->_idProposta, $corpo);
        $corpo = str_replace("[contato]", '(51) 3383-5100 RAMAL: 5002', $corpo);

        $this->_corretorRecipientEmailNotification = new RecipientEmailNotification();
        $this->_corretorRecipientEmailNotification->setEmailSubject($titulo);
        $this->_corretorRecipientEmailNotification->setEmailBody($corpo);
    }

    /**
     * Define o título e corpo do e-mail do Responsavel pela instituição financeira
     */
    private function personalizarEmailResponsavelFinanceiro(): void
    {
        $titulo = DOCUSIGN_TITULO_EMAIL_RESP_FINANCEIRO;
        $titulo = str_replace("[id_proposta_completa]", $this->_idPropostaCompleto, $titulo);
        $titulo = str_replace("[id_proposta]", $this->_idProposta, $titulo);
        
        $corpo = DOCUSIGN_CORPO_EMAIL_RESP_FINANCEIRO;
        $corpo = str_replace("[id_proposta_completa]", $this->_idPropostaCompleto, $corpo);
        $corpo = str_replace("[id_proposta]", $this->_idProposta, $corpo);
        $corpo = str_replace("[contato]", '(51) 3383-5100 RAMAL: 5002', $corpo);

        $this->_respFinanceiroRecipientEmailNotification = new RecipientEmailNotification();
        $this->_respFinanceiroRecipientEmailNotification->setEmailSubject($titulo);
        $this->_respFinanceiroRecipientEmailNotification->setEmailBody($corpo);
    }
}
