<?php

use DocuSign\eSign\Model\TemplateRecipients;
use DocuSign\eSign\Model\TemplateRole;

class Agro_DocuSign_EmailTemplate extends Agro_DocuSign_Email
{
    private Agro_DocuSign_Template $template;
    /**
     *  Guarda um objeto contendo email e name indexado pelo roleName
     *  @param object[] $destinatariosByRole
     */
    private array $destinatariosByRole;
    
    /**
     * __construct
     *
     * @param  int $tipoTemplate
     */
    public function __construct(int $tipoTemplate)
    {
        parent::__construct();

        $this->template = Agro_DocuSign_TemplateFactory::get(
            $this->docuSignAuth->getApiClient(),
            $tipoTemplate
        );
    }

    /**
     * Define um template
     *
     * @param  Agro_DocuSign_Template $template
     */
    public function setTemplate(Agro_DocuSign_Template $template)
    {
        $this->template = $template;
    }
        
    /**
     * Retorna o template
     *
     * @return Agro_DocuSign_Template
     */
    public function getTemplate(): Agro_DocuSign_Template
    {
        return $this->template;
    }

    /**
     * Adiciona um signatário
     *
     * @param  string $email
     * @param  string $nome
     * @param  string $roleName
     */
    public function addSignatario(string $email, string $nome, string $roleName = 'signer')
    {
        echo "- add signatários template... <br>";
        $templateRole = new TemplateRole([
            'email' => $email,
            'name' => $nome,
            'role_name' => $roleName,
            'tabs' => $this->template->deParaCampos()
        ]); 

        $this->signatarios[] = $templateRole;
        $this->destinatariosByRole[$roleName] = (object) ['email' => $email, 'name' => $nome];
    }
        
    /**
     * Adiciona as configurações de template e signatarios no envelope
     */
    protected function configurarSignatarios()
    {
        echo "- Configurando signatários template... <br>";
        $this->envelopeDefinition->setTemplateId($this->template->getId());
        $this->envelopeDefinition->setTemplateRoles($this->signatarios);

        return;

        $envelopeTemplate = $this->template->getEnvelopeTemplate();
        $data['signers'] = null;

        if (!empty($envelopeTemplate)) {
            $data['signers'] = $envelopeTemplate->getRecipients()->getSigners();

            foreach ($data['signers'] as &$signer) {
                $roleName = $signer['role_name'];
                if (array_key_exists($roleName, $this->destinatariosByRole)) {
                    $signer['email'] = $this->destinatariosByRole[$roleName]->email;
                    $signer['name'] = $this->destinatariosByRole[$roleName]->name;
                }
            }
        }

        if (!empty($data['signers'])) {
            $this->updateDestinatariosTemplate($data);
        }
    }

    /**
     * Percorre todos os signers do template limpando o email e name de cada um.
     */
    public function limparDestinatariosTemplate() 
    {
        echo "- limparDestinatariosTemplate <br>";
        $envelopeTemplate = $this->template->getEnvelopeTemplate();
        $data['signers'] = null;

        if (!empty($envelopeTemplate)) {
            $data['signers'] = $envelopeTemplate->getRecipients()->getSigners();

            foreach ($data['signers'] as &$signer) {
                $signer['email'] = '';
                $signer['name'] = '';
            }
        }

        if (!empty($data['signers'])) {
            $this->updateDestinatariosTemplate($data);
        }
    }

    /**
     * Atualiza os recipients (destinatários) do template.
     * É necessário que seja informado um array com a posição signers ($data['signers']) como parâmetro
     * 
     * @param DocuSign\eSign\Model\Signer[] $data
     */
    public function updateDestinatariosTemplate(array $data) 
    {
        $templateRecipients = new TemplateRecipients($data);
        $this->template->getTemplateApi()->updateRecipients(Agro_DocuSign_Auth::$docusignApiAccountId, $this->template->getId(), $templateRecipients);
    }

    /**
     * Sobrescreve a função enviar da classe pai, para que possa ser chamado o método
     * limparDestinatariosTemplate ao enviar o envelope.
     *
     * @return string|null
     */
    public function enviar($isRascunho = false): ?string
    {
        $idEnvelope = parent::enviar($isRascunho = false);
        //$this->limparDestinatariosTemplate();
        return $idEnvelope;
    }
}
