<?php

class Endosso_Service_Solicitacao
{
    public function buscarDadosResponsavelTipoSolicitacao(int $idTipoSolicitacao): array
    {
        return (new Endosso_Model_TiposSolicitacao())
            ->getUsuarioResponsavelTipoSolicitacao($idTipoSolicitacao)
            ->toArray();
    }

    public function validarSeTipoSolicitacaoComMovimento(?array $dadosAlterados, int $idProposta): bool
    {
        if (empty($dadosAlterados)) {
            return false;
        }

        if ($this->validarSeTipoSolicitacaoComMovimentoQuestionario($dadosAlterados['btnQuestionario'])) {
            return true;
        }

        if ($this->validarSeTipoSolicitacaoComMovimentoResumosCoberturas($dadosAlterados['btnResumosCoberturas'])) {
            return true;
        }

        if ($this->validarSeTipoSolicitacaoComMovimentoLmga($idProposta)) {
            return true;
        }

        return false;
    }

    private function validarSeTipoSolicitacaoComMovimentoLmga(int $idProposta): bool
    {
        $modelPropostas = new Seguro_Model_Propostas();
        $statusDesconsiderar = [
            Seguro_Model_Propostas::ID_STATUS_ENDOSSO_INCOMPLETO,
            Seguro_Model_Propostas::ID_STATUS_SOLICITACAO_CANCELADA,
            Seguro_Model_Propostas::ID_STATUS_SOLICITACAO_ENDOSSO,
        ];
        $propostaAtual = $modelPropostas->find($idProposta)->current();
        $arrayDadosPropostaAnterior = $propostaAtual->getPropostaAnterior($statusDesconsiderar);
        $propostaAnterior = $modelPropostas->find($arrayDadosPropostaAnterior['id'])->current();

        $lmgaAtual = $propostaAtual->lmga();
        $lmgaAnterior = $propostaAnterior->lmga();

        return $lmgaAtual !== $lmgaAnterior;
    }

    private function validarSeTipoSolicitacaoComMovimentoQuestionario(?array $dados): bool
    {
        if (!isset($dados)) {
            return false;
        }

        foreach ($dados['E'] as $atributo) {
            if (
                in_array(
                    $atributo['name'],
                    ['questionario[QUEST_SUBVENCAO_FEDERAL]', 'questionario[QUEST_SUBVENCAO_ESTADUAL]']
                )
            ) {
                return true;
            }
        }

        return false;
    }

    private function validarSeTipoSolicitacaoComMovimentoResumosCoberturas(?array $dados): bool
    {
        if (!isset($dados)) {
            return false;
        }

        foreach ($dados['E'] as $atributo) {
            if (preg_match('/\[vl_franquia]/', $atributo['name'])) {
                return true;
            }
        }

        /**
         * D: Cobertura excluída
         * I: Cobertura incluída
         */
        if (isset($dados['D']) || isset($dados['I'])) {
            return true;
        }

        return false;
    }
}