<?php declare(strict_types=1);

class Produto_Model_ProdutoCoberturaConfig extends Agro_Db_Table_Abstract
{
    protected $_schema = 'produto';
	protected $_name = 'produto_cobertura_config';
	protected $_primary = 'id';

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

        $row = $this->createRow();

        $row->id_produto = $dados['id_produto'];
        $row->id_cobertura = $dados['id_cobertura'];
        $row->ds_frase_outros_riscos_excluidos = $dados['ds_frase_outros_riscos_excluidos'];
        $row->ds_frase_condicoes_particulares = $dados['ds_frase_condicoes_particulares'];
        $row->dt_inicio_validade = $dados['dt_inicio_validade'];
        
        return $row->save();
    }

    public function findByIdProduto(int $idProduto)
    {
        return $this->fetchRow(['id_produto' => $idProduto, 'fl_ativo' => true]);
    }

    public function getConfiguracaoMaisRecente(
        int $idProduto,
        int $idCobertura
    ): ?Zend_Db_Table_Row {
        $dateTime = (new Produto_Model_ConfiguracaoDataCorte())->getUltimaData();
        $data = $dateTime->format('Y-m-d');
        
        $query = $this->select()
            ->from(['produto_cobertura_config' => 'produto.produto_cobertura_config'])
            ->join(
                ['produto_cobertura' => 'produto.produtos_coberturas'],
                'produto_cobertura.id_produto = produto_cobertura_config.id_produto
                AND produto_cobertura.id_cobertura = produto_cobertura_config.id_cobertura',
                false
            )
            ->where('produto_cobertura_config.id_produto = ?', $idProduto)
            ->where('produto_cobertura_config.id_cobertura = ?', $idCobertura)
            ->where('produto_cobertura_config.dt_inicio_validade = ?', $data)
            ->where('produto_cobertura_config.fl_ativo IS TRUE');
        
        return $this->fetchRow($query) ?? null;
    }

    public function getConfiguracaoByData(int $idProduto, int $idCobertura, DateTime $data): ?Zend_Db_Table_Row
    {
        $query = $this->select()
            ->from(
                ['produto_cobertura_config' => 'produto.produto_cobertura_config'],
                'MAX(dt_inicio_validade) AS dt_inicio_validade, id'
            )
            ->where('id_produto = ?', $idProduto)
            ->where('id_cobertura = ?', $idCobertura)
            ->where('dt_inicio_validade <= ?', $data->format('Y-m-d'))
            ->where('fl_ativo IS TRUE')
            ->group('id')
            ->order('id DESC')
            ->limit(1);
        
        $row = $this->fetchRow($query);

        if (empty($row)) {
            return null;
        }

        $row = $this->fetchRow(
            $this->select()
                ->from(['produto_cobertura_config' => 'produto.produto_cobertura_config'])
                ->where('id = ?', $row['id'])
        );

        return $row;
    }

    public function getConfiguracaoByDataCorte(int $idProduto, int $idCobertura, DateTime $data): ?Zend_Db_Table_Row
    {
        $query = $this->select()
            ->from(
                ['produto_cobertura_config' => 'produto.produto_cobertura_config'],
                'MAX(dt_inicio_validade) AS dt_inicio_validade, id'
            )
            ->where('id_produto = ?', $idProduto)
            ->where('id_cobertura = ?', $idCobertura)
            ->where('dt_inicio_validade = ?', $data->format('Y-m-d'))
            ->where('fl_ativo IS TRUE')
            ->group('id')
            ->order('id DESC')
            ->limit(1);
        
        $row = $this->fetchRow($query);

        if (empty($row)) {
            return null;
        }

        $row = $this->fetchRow(
            $this->select()
                ->from(['produto_cobertura_config' => 'produto.produto_cobertura_config'])
                ->where('id = ?', $row['id'])
        );

        return $row;
    }

    public function getConfiguracoesPorProdutoData(int $idProduto, DateTime $data): array
    {
        return $this->_db->fetchAll(
            'WITH configuracao AS (
                SELECT
                    id_cobertura,
                    ds_frase_outros_riscos_excluidos,
                    ds_frase_condicoes_particulares,
                    id,
                    ROW_NUMBER() OVER (
                        PARTITION BY id_cobertura
                        ORDER BY dt_inicio_validade DESC
                    ) AS rn
                FROM produto.produto_cobertura_config
                WHERE id_produto = '. $idProduto .'
                    AND dt_inicio_validade <= \''. $data->format('Y-m-d') .'\'
                    AND fl_ativo IS TRUE
            ) SELECT
                id,
                id_cobertura,
                ds_frase_outros_riscos_excluidos,
                ds_frase_condicoes_particulares
            FROM configuracao
            WHERE rn = 1'
        );
    }
}
