<?php

class Produto_Model_ValidacoesRestricoesCriteriosPropostasExcecoes extends Agro_Db_Table_Abstract
{
    protected $_schema = 'produto';
    protected $_name = 'validacoes_restricoes_criterios_propostas_excecoes';
    protected $_primary = 'id';
    public $_order = 'id';

    public function propostaJaCadastrada(int $idValidacoesRestricoesCriterios, int $idProposta)
    {
        $where = "id_validacoes_restricoes_criterios = {$idValidacoesRestricoesCriterios}";
        $where .= " AND id_proposta = {$idProposta}";

        return !empty($this->fetchAll($where)->toArray());
    }

    private function propostaValida(int $idProposta)
    {
        return !empty((new Seguro_Model_Propostas())->find($idProposta)->toArray());
    }

    /**
     * @param array $dados
     * @return false|Zend_Db_Table_Row_Abstract|null
     * @throws Exception
     */
    public function save(array $dados)
    {
        if ($this->propostaJaCadastrada($dados['id_validacoes_restricoes_criterios'], $dados['id_proposta'])) {
            throw new Exception('Orçamento já cadastrado.');
        }

        if (!$this->propostaValida((int)$dados['id_proposta'])) {
            throw new Exception('Orçamento não encontrado.');
        }

        if (!$this->validarPropostaComRestricao($dados['id_validacoes_restricoes_criterios'], $dados['id_proposta'])) {
            $mensagem = "As informações do orçamento não batem com as informações lançadas na restrição";
            $mensagem .= ", para que seja configurado como exceção.";
            $mensagem .= " (Safra, Cultura, Produto, Cobertura e/ou Município)";

            throw new Exception($mensagem);
        }

        $row = $this->getRow($dados['id']);
        $row->id_validacoes_restricoes_criterios = $dados['id_validacoes_restricoes_criterios'];
        $row->id_proposta = $dados['id_proposta'];

        if (!$row->save()) {
            throw new Exception('Erro ao salvar o vínculo do orçamento com o critério.');
        }

        return $row;
    }

    private function validarPropostaComRestricao(int $idValidacoesRestricoesCriterios, int $idProposta)
    {
        $rowProposta = (new Seguro_Model_Propostas())->find($idProposta)->current();
        $propriedadeProposta = $rowProposta->propriedade();
        $coberturasContratadas = $rowProposta->coberturas_contratadas();
        $produto = $rowProposta->produto();
        $restricoesCriterios = (new Produto_Model_ValidacoesRestricoesCriterios())
            ->getDadosRestricaoByIdRestricaoCriterio($idValidacoesRestricoesCriterios)
            ->toArray();
        $dadosOrganizados = [];

        foreach ($restricoesCriterios as $registro) {
            if (!in_array($registro['id_safra'], $dadosOrganizados['safras'])) {
                $dadosOrganizados['safras'][] = $registro['id_safra'];
            }

            if (!in_array($registro['id_cultura'], $dadosOrganizados['culturas'])) {
                $dadosOrganizados['culturas'][] = $registro['id_cultura'];
            }

            if (!empty($registro['id_produto']) && !in_array($registro['id_produto'], $dadosOrganizados['produtos'])) {
                $dadosOrganizados['produtos'][] = $registro['id_produto'];
            }

            if (
                !empty($registro['id_cobertura'])
                && !in_array($registro['id_cobertura'], $dadosOrganizados['coberturas'])
            ) {
                $dadosOrganizados['coberturas'][] = $registro['id_cobertura'];
            }

            if (
                !empty($registro['id_municipio'])
                && !in_array($registro['id_municipio'], $dadosOrganizados['municipios'])
            ) {
                $dadosOrganizados['municipios'][] = $registro['id_municipio'];
            }
        }

        $safraOk = $culturaOk = $produtoOk = $coberturaOk = $municipioOk = true;

        if (!in_array($produto['id_safra'], $dadosOrganizados['safras'])) {
            $safraOk = false;
        }

        if (!in_array($produto['id_cultura'], $dadosOrganizados['culturas'])) {
            $culturaOk = false;
        }

        if (!empty($dadosOrganizados['produtos']) && !in_array($produto['id'], $dadosOrganizados['produtos'])) {
            $produtoOk = false;
        }

        if (
            !empty($dadosOrganizados['municipios'])
            && !in_array($propriedadeProposta['id_municipio'], $dadosOrganizados['municipios'])
        ) {
            $municipioOk = false;
        }

        if (!empty($dadosOrganizados['coberturas'])) {
            foreach ($coberturasContratadas as $cobertura) {
                if (!in_array($cobertura['id'], $dadosOrganizados['coberturas'])) {
                    $coberturaOk = false;
                }
            }
        }

        return $safraOk && $culturaOk && $produtoOk && $coberturaOk && $municipioOk;
    }
}
