<?php declare(strict_types=1);

class Produto_Model_CondicaoEspecialConfiguracao extends Agro_Db_Table_Abstract
{
    protected $_schema = 'produto';
	protected $_name = 'condicao_especial_configuracao';
	protected $_primary = 'id';

    public function save(array $dados): int
    {
        $this->_db->query("
            UPDATE produto.condicao_especial_configuracao
            SET fl_ativo = FALSE
            WHERE id_condicao_especial = {$dados['id_condicao_especial']}
                AND dt_inicio_validade = '{$dados['dt_inicio_validade']}'
                AND fl_ativo IS TRUE
        ");

        $row = $this->createRow();

        $row->id_condicao_especial = $dados['id_condicao_especial'];
        $row->ds_condicao_especial = $dados['ds_condicao_especial'];
        $row->dt_inicio_validade = $dados['dt_inicio_validade'];

        return $row->save();
    }

    public function getConfiguracoesPorProdutoData(int $idProduto, DateTime $dateTime, int $idCobertura = 0): array
    {
        $whereCobertura = '';
        if ($idCobertura) {
            $whereCobertura = 'AND cond.id_cobertura = '. $idCobertura;
        }

        $dateTimeDataCorte = (new Produto_Model_ConfiguracaoDataCorte())->getDataCorteAConsiderar($dateTime);

        return $this->_db->fetchAll(
            'WITH configuracao AS (
                SELECT
                    condicao_especial_configuracao.id,
                    condicao_especial_configuracao.id_condicao_especial,
                    ROW_NUMBER() OVER (
                        PARTITION BY condicao_especial_configuracao.id_condicao_especial
                        ORDER BY dt_inicio_validade DESC
                    ) AS rn
                FROM produto.condicao_especial_configuracao
                INNER JOIN produto.condicoes_especiais
                    ON condicoes_especiais.id = condicao_especial_configuracao.id_condicao_especial
                INNER JOIN produto.produtos_coberturas_condicoes_especiais cond
                    ON cond.id_condicao_especial = condicao_especial_configuracao.id_condicao_especial
                INNER JOIN produto.produtos_coberturas
                    ON produtos_coberturas.id_produto = cond.id_produto
                        AND produtos_coberturas.id_cobertura = cond.id_cobertura
                WHERE cond.id_produto = '. $idProduto .'
                    '. $whereCobertura .'
                    AND condicao_especial_configuracao.dt_inicio_validade = \''. $dateTimeDataCorte->format('Y-m-d') .'\'
                    AND condicao_especial_configuracao.fl_ativo IS TRUE
            ) SELECT
                configuracao.id,
                configuracao.id_condicao_especial,
                ds_titulo,
                ds_complemento
            FROM configuracao
            INNER JOIN produto.condicoes_especiais
                ON condicoes_especiais.id = configuracao.id_condicao_especial
            WHERE rn = 1'
        );
    }
    
    public function getConfiguracaoPorData(int $idCondicaoEspecial, DateTime $dateTime): ?Zend_Db_Table_Row
    {
        return $this->fetchRow(
            $this->select()
                ->from(['condicao_especial_configuracao' => 'produto.condicao_especial_configuracao'])
                ->where('fl_ativo IS TRUE')
                ->where('id_condicao_especial = ?', $idCondicaoEspecial)
                ->where('dt_inicio_validade = ?', $dateTime->format('Y-m-d'))
        );
    }

}