<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class Task2202251322 extends AbstractMigration
{
    public function up(): void
    {
        $this->upDDL();
        $this->upView();
    }

    private function upDDL()
    {
        $this->execute(<<<SQL
ALTER TABLE produto.validacoes_limites_capacidade ADD COLUMN vl_reserva_tecnica NUMERIC(12, 2);
SQL
        );
    }

    private function upView()
    {
        $this->execute(<<<SQL
CREATE OR REPLACE VIEW produto.v_limite_capacidade_utilizado_resumido AS
  SELECT DISTINCT validacoes_limites_capacidade.id_usuario_criacao,
    validacoes_limites_capacidade.id_usuario_alteracao,
    validacoes_limites_capacidade.dt_criacao,
    validacoes_limites_capacidade.dt_alteracao,
    validacoes_limites_capacidade.fl_ativo,
    validacoes_limites_capacidade.fl_del,
    validacoes_limites_capacidade.id,
    validacoes_limites_capacidade.ds_nome_grupo,
    validacoes_limites_capacidade.vl_limite_capacidade,
    validacoes_limites_capacidade.fl_agrupar_municipios,
    validacoes_limites_capacidade.fl_limite_corretor,
    validacoes_limites_capacidade.tipo_corretor_vinculo,
    validacoes_limites_capacidade.id_parent,
    validacoes_limites_capacidade_produtos.id_safra,
    0 AS count_parent,
    validacoes_limites_capacidade.vl_reserva_tecnica
   FROM produto.validacoes_limites_capacidade
     JOIN ( SELECT validacoes_limites_capacidade_produtos_1.id_grupo_limite_capacidade,
            produtos.id_safra
           FROM produto.validacoes_limites_capacidade_produtos validacoes_limites_capacidade_produtos_1
             JOIN produto.produtos ON produtos.id = validacoes_limites_capacidade_produtos_1.id_produto
             JOIN produto.produtos_geral ON produtos_geral.id = produtos.id_produto_geral
             JOIN produto.culturas ON culturas.id = produtos_geral.id_cultura
          GROUP BY validacoes_limites_capacidade_produtos_1.id_grupo_limite_capacidade, produtos.id_safra
          ORDER BY validacoes_limites_capacidade_produtos_1.id_grupo_limite_capacidade) validacoes_limites_capacidade_produtos ON validacoes_limites_capacidade_produtos.id_grupo_limite_capacidade = validacoes_limites_capacidade.id
  WHERE 1 = 1
  ORDER BY validacoes_limites_capacidade.ds_nome_grupo;
SQL
        );
    }

    public function down(): void
    {
        $this->downView();
        $this->downDDL();
    }

    private function downDDL()
    {
        $this->execute(<<<SQL
ALTER TABLE produto.validacoes_limites_capacidade DROP COLUMN vl_reserva_tecnica;
SQL
        );
    }

    private function downView()
    {
        $this->execute(<<<SQL
DROP VIEW produto.v_limite_capacidade_utilizado_resumido;
CREATE OR REPLACE VIEW produto.v_limite_capacidade_utilizado_resumido AS
  SELECT DISTINCT validacoes_limites_capacidade.id_usuario_criacao,
    validacoes_limites_capacidade.id_usuario_alteracao,
    validacoes_limites_capacidade.dt_criacao,
    validacoes_limites_capacidade.dt_alteracao,
    validacoes_limites_capacidade.fl_ativo,
    validacoes_limites_capacidade.fl_del,
    validacoes_limites_capacidade.id,
    validacoes_limites_capacidade.ds_nome_grupo,
    validacoes_limites_capacidade.vl_limite_capacidade,
    validacoes_limites_capacidade.fl_agrupar_municipios,
    validacoes_limites_capacidade.fl_limite_corretor,
    validacoes_limites_capacidade.tipo_corretor_vinculo,
    validacoes_limites_capacidade.id_parent,
    validacoes_limites_capacidade_produtos.id_safra,
    0 AS count_parent
   FROM produto.validacoes_limites_capacidade
     JOIN ( SELECT validacoes_limites_capacidade_produtos_1.id_grupo_limite_capacidade,
            produtos.id_safra
           FROM produto.validacoes_limites_capacidade_produtos validacoes_limites_capacidade_produtos_1
             JOIN produto.produtos ON produtos.id = validacoes_limites_capacidade_produtos_1.id_produto
             JOIN produto.produtos_geral ON produtos_geral.id = produtos.id_produto_geral
             JOIN produto.culturas ON culturas.id = produtos_geral.id_cultura
          GROUP BY validacoes_limites_capacidade_produtos_1.id_grupo_limite_capacidade, produtos.id_safra
          ORDER BY validacoes_limites_capacidade_produtos_1.id_grupo_limite_capacidade) validacoes_limites_capacidade_produtos ON validacoes_limites_capacidade_produtos.id_grupo_limite_capacidade = validacoes_limites_capacidade.id
  WHERE 1 = 1
  ORDER BY validacoes_limites_capacidade.ds_nome_grupo;
SQL
        );
    }
}
