<?php

class Seguro_Service_PropostaCancelamentoApolice
{
    /**
     * @param array $dados
     * @return bool
     * @throws Zend_Date_Exception
     * @throws Zend_Exception
     * @throws Zend_Validate_Exception
     */
    public function salvar(array $dados): bool
    {
        $validator = new Seguro_Validator_PropostaCancelamentoApolice();
        $dadosValidos = $validator->validar($dados);

        if (!$dadosValidos) {
            $erros = $validator->getErros();
            $mensagem = "Não foi possível salvar as informações de cancelamento da apólice.";

            foreach ($erros as $erro) {
                $mensagem .= "\n" . $erro;
            }

            throw new Zend_Exception($mensagem);
        }

        $idProposta = (int)$dados['id_proposta'];
        $dataInicioVigenciaCancelamento = Agro_Utils_Date::create(
            $dados['dt_inicio_vigencia_cancelamento'],
            Agro_Utils_Date::FORMAT_PT_BR
        );

        $dadosPropostaMae = (new Seguro_Service_Proposta())->dadosPropostaMae($idProposta);

        if (
            !Agro_Util::checkBetweenDatas(
                $dataInicioVigenciaCancelamento->toString(Agro_Utils_Date::FORMAT_ISO_8601),
                $dadosPropostaMae['dt_vigencia_inicio'],
                $dadosPropostaMae['dt_vigencia_fim']
            )
        ) {
            $dataInicioPropostaMae = Agro_Util::formatDate($dadosPropostaMae['dt_vigencia_inicio']);
            $dataFimPropostaMae = Agro_Util::formatDate($dadosPropostaMae['dt_vigencia_fim']);
            $mensagem = "Data deve estar entre o início e fim da vigência do endosso 0 ({$dataInicioPropostaMae} -";
            $mensagem .= " {$dataFimPropostaMae}).";

            throw new Zend_Exception($mensagem);
        }

        $entityPropostaCancelamentoApolice = new Seguro_Entity_PropostaCancelamentoApolice(
            $idProposta,
            $dataInicioVigenciaCancelamento
        );

        (new Seguro_Model_PropostaCancelamentoApolice())->save($entityPropostaCancelamentoApolice);

        return true;
    }
}