<?php

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

    public function criterioJaSalvo(int $idValidacoesRestricoes, int $idCriteriosRestricao)
    {
        return !empty($this->fetchAll(
            "id_validacoes_restricoes = {$idValidacoesRestricoes} AND id_criterios_restricao = {$idCriteriosRestricao}"
        )->toArray());
    }

    public function deletarVinculos(int $idRestricaoCriterio)
    {
        (new Produto_Model_ValidacoesRestricoesCriteriosPropostasExcecoes())->delete(
            $idRestricaoCriterio,
            'id_validacoes_restricoes_criterios'
        );

        (new Produto_Model_ValidacoesRestricoesCriteriosSemeadura())->delete(
            $idRestricaoCriterio,
            'id_validacoes_restricoes_criterios'
        );

        (new Produto_Model_ValidacoesRestricoesCriteriosSistemaPlantio())->delete(
            $idRestricaoCriterio,
            'id_validacoes_restricoes_criterios'
        );

        (new Produto_Model_ValidacoesRestricoesCriteriosTipoSolo())->delete(
            $idRestricaoCriterio,
            'id_validacoes_restricoes_criterios'
        );
    }

    public function getCriteriosVinculados(int $idValidacoesRestricoes)
    {
        $campos = [
            'pvrc.id as id_restricao_criterio',
            'pcr.id as id_criterio',
            'pcr.ds_nome',
            'pvrcs.dt_semeadura_inicio',
            'pvrcs.dt_semeadura_fim',
            "CASE
               WHEN pvrcsp.id_sistema_plantio = 1
                 THEN 'Direto'
               WHEN pvrcsp.id_sistema_plantio = 2
                 THEN 'Convencional'
               WHEN pvrcsp.id_sistema_plantio = 3
                 THEN 'A Lanço'
              END AS sistema_plantio",
            'pvrcsp.id_sistema_plantio',
            'pts.ds_tipo_solo',
            'pts.id as id_tipo_solo',
            
        ];

        $select = $this->select()->setIntegrityCheck(false);
        $select->from(['pvrc' => "{$this->_schema}.{$this->_name}"], $campos)
            ->join(['pcr' => 'produto.criterios_restricao'], 'pcr.id = pvrc.id_criterios_restricao', false)
            ->joinLeft(
                ['pvrcs' => 'produto.validacoes_restricoes_criterios_semeadura'],
                'pvrcs.id_validacoes_restricoes_criterios = pvrc.id',
                false
            )
            ->joinLeft(
                ['pvrcsp' => 'produto.validacoes_restricoes_criterios_sistema_plantio'],
                'pvrcsp.id_validacoes_restricoes_criterios = pvrc.id',
                false
            )
            ->joinLeft(
                ['pvrcts' => 'produto.validacoes_restricoes_criterios_tipo_solo'],
                'pvrcts.id_validacoes_restricoes_criterios = pvrc.id',
                false
            )
            ->joinLeft(['pts' => 'produto.tipo_solo'], 'pts.id = pvrcts.id_tipo_solo', false)
            ->where('pvrc.id_validacoes_restricoes = ?', $idValidacoesRestricoes)
            ->order('pcr.id');

        $camposDadosAgrupados = [
            'id_restricao_criterio',
            'id_criterio',
            'ds_nome',
            'dt_semeadura_inicio',
            'dt_semeadura_fim',
            "array_to_string(array_agg(sistema_plantio), ', ') as sistema_plantio",
            'id_sistema_plantio',
            "array_to_string(array_agg(ds_tipo_solo), ', ') as tipo_solo",
            'id_tipo_solo',
            
        ];

        $group = [
            'id_restricao_criterio',
            'id_criterio',
            'ds_nome',
            'dt_semeadura_inicio',
            'dt_semeadura_fim',
            'id_tipo_solo',
            'id_sistema_plantio',
        ];

        $selectDadosAgrupados = $this->select()->setIntegrityCheck(false);
        $selectDadosAgrupados->from(['dados_agrupados' => $select], $camposDadosAgrupados)
            ->group($group)
            ->order('id_criterio');

        return $this->fetchAll($selectDadosAgrupados);
    }

    public function getDadosRestricaoByIdRestricaoCriterio(int $idValidacoesRestricoesCriterios)
    {
        $campos = [
            'pvrc.id',
            'pvr.id_safra',
            'pvrcu.id_cultura',
            'pvrp.id_produto',
            'pvrco.id_cobertura',
            'pvrm.id_municipio',
        ];

        $select = $this->select()->setIntegrityCheck(false);
        $select->from(['pvrc' => "{$this->_schema}.{$this->_name}"], $campos)
            ->join(['pvr' => 'produto.validacoes_restricoes'], 'pvr.id = pvrc.id_validacoes_restricoes', false)
            ->join(
                ['pvrcu' => 'produto.validacoes_restricoes_culturas'],
                'pvrcu.id_validacoes_restricoes = pvr.id',
                false
            )
            ->joinLeft(
                ['pvrp' => 'produto.validacoes_restricoes_produtos'],
                'pvrp.id_validacoes_restricoes = pvr.id',
                false
            )
            ->joinLeft(
                ['pvrco' => 'produto.validacoes_restricoes_coberturas'],
                'pvrco.id_validacoes_restricoes = pvr.id',
                false
            )
            ->joinLeft(
                ['pvrm' => 'produto.validacoes_restricoes_municipios'],
                'pvrm.id_validacoes_restricoes = pvr.id',
                false
            )
            ->where('pvrc.id = ?', $idValidacoesRestricoesCriterios)
            ->order(['pvrcu.id_cultura', 'pvrp.id_produto', 'pvrco.id_cobertura', 'pvrm.id_municipio']);

        return $this->fetchAll($select);
    }

    /**
     * @param array $dados
     * @return false|Zend_Db_Table_Row_Abstract|null
     * @throws Exception
     */
    public function save(array $dados, bool $validarCriterioSalvo = false)
    {
        if (
            $validarCriterioSalvo
            && $this->criterioJaSalvo($dados['id_validacoes_restricoes'], $dados['id_criterios_restricao'])
        ) {
            throw new Exception('Critério já vinculado.');
        }

        $row = $this->getRow($dados['id']);
        $row->id_validacoes_restricoes = $dados['id_validacoes_restricoes'];
        $row->id_criterios_restricao = $dados['id_criterios_restricao'];

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

        return $row;
    }

            /**
    * Compara valores sendo salvos na unidade com valores das restrições encontradas.
    *
    * Retorna um booleano para cada critério que for ferido, quando comparado com os valores da unidade segurada
    * @param array $arr Array associativo contendo os seguintes parâmetros:
    *  - int 'idCriterio' ID da criterio existente na tabela produtos.criterios_restricao.
    *  - array 'unidade' unidade seguradora sendo salva.
    *  - array 'configuracao' conjunto de critérios configurados para a restrição.
    *
    * @return boolean Retorna true se o critério sendo validado for ferido,
    *                     ou false se não ferir.
    */
    public function validar(int $idCriterio, array $unidade, array $configuracao, $idProposta): bool {
        $modelValidacoesExcecoes = new Produto_Model_ValidacoesRestricoesCriteriosPropostasExcecoes();
        if($modelValidacoesExcecoes->propostaJaCadastrada($configuracao['id_restricao_criterio'], $idProposta)){
            return false;
        }



        switch ($idCriterio) {
            case 1:
                return (int)$unidade['IS_PRIMEIRO_ANO_PLANTIO'] === 1;
            case 2:
                $anoPlantio = (int)$unidade['IS_PRIMEIRO_ANO_PLANTIO'];
                return $anoPlantio > 0 && $anoPlantio < 3;
            case 3:
                $dataUnidade = ($unidade['IS_DATA_SEMEADURA']) ? $unidade['IS_DATA_SEMEADURA'] : $unidade['IS_DATA_PLANTIO_TRANSPLANTE'];
                $dataUnidade = date("Y-d-m", strtotime($dataUnidade));

                return !($dataUnidade >= $configuracao['dt_semeadura_inicio'] && $dataUnidade <= $configuracao['dt_semeadura_fim']);
                break;
            case 4:
                if(!(int)$unidade['IS_SISTEMA_PLANTIO']){
                    switch($unidade['IS_SISTEMA_PLANTIO']){
                        case 'Direto':
                            $unidade['IS_SISTEMA_PLANTIO'] = 1;
                            break;
                        case 'Convencional':
                            $unidade['IS_SISTEMA_PLANTIO'] = 2;
                            break;
                        case 'A Lanço':
                            $unidade['IS_SISTEMA_PLANTIO'] = 3;
                            break;
                    }
                }
                return $unidade['IS_SISTEMA_PLANTIO'] == $configuracao['id_sistema_plantio'];
                break;
            case 5:
                $unidade['IS_TIPO_SOLO'] = isset($unidade['IS_TIPO_SOLO']) ? $unidade['IS_TIPO_SOLO'] : $unidade['IS_TIPO_SOLO_AD'];
                return (int)$unidade['IS_TIPO_SOLO'] === $configuracao['id_tipo_solo'];
            case 6:
                $id_variedade = (int)$unidade['IS_VARIEDADES'];
                $objVariedade = new Produto_Model_Variedades();
                $rowVariedade = $objVariedade->getRow($id_variedade)->toArray();
                return !$rowVariedade['fl_transgenico'];
                break;
            default:
                return false;
        }

    }
}
