<?php

class Agro_DocuSign_Base extends Agro_Db_Table_Abstract
{
    const STATUS_WAITING = 'waiting';
    const STATUS_ERROR = 'error';
    const STATUS_SENT = 'sent';
    const STATUS_COMPLETED = 'completed';
    const STATUS_VOIDED = 'voided';
    const STATUS_DECLINED = 'declined';
    const STATUS_DELIVERED = 'delivered';
    const STATUS_CREATED = 'created';

    /**
     * Busca o status e a mensagem de erro/observação do envelope
     * 
     * @param string $idEnvelope
     * @param string $dsStatus
     * @return array
     */
    public function buscarStatusEnvelope(string $idEnvelope, string $dsStatus): array
    {
        $retorno = ['ds_status' => $dsStatus, 'ds_mensagem' => ''];
        $emailCompositeTemplates = new Agro_DocuSign_EmailCompositeTemplates();
        $envelope = $emailCompositeTemplates->getEnvelope($idEnvelope);

        if ($envelope->getStatus() != $dsStatus) {
            
            if ($envelope->getStatus() == self::STATUS_VOIDED) {
                $retorno['ds_mensagem'] = $envelope->getVoidedReason();
            }

            if ($envelope->getStatus() == self::STATUS_DECLINED) {
                $mensagem = '';
                foreach ($envelope->getRecipients()->getSigners() as $signer) {
                    $declinedReason = $signer->getDeclinedReason();
                    if (!empty($declinedReason)) {
                        $mensagem .= $declinedReason;
                    }
                }
                $retorno['ds_mensagem'] = $mensagem;
            }

            $retorno['ds_status'] = $envelope->getStatus();
        }

        return $retorno;
    }

    /**
     * Retorna a descrição pelo status informado no parâmetro
     *
     * @param string|null $status
     * @return string
     */
    public static function getDescricaoStatus(?string $chaveStatus): ?string
    {
        $modelStatus = new Sistema_Model_Status();
        $select = $modelStatus->getData("s.ds_chave = '{$chaveStatus}' AND ts.ds_chave = 'ASSINATURA_ELETRONICA'");
        $status = $modelStatus->getAdapter()->fetchAll($select);
        return !empty($status[0]['ds_status']) ? $status[0]['ds_status'] : $chaveStatus;
    }
}
