<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class Task2206101519 extends AbstractMigration
{
    public function up(): void
    {
        $this->execute("DROP VIEW produto.v_limite_capacidade_utilizado_resumido;");

        $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,
                    (
                    SELECT CAST(COUNT(*) AS INT) as total
                        FROM produto.validacoes_limites_capacidade tmp
                        WHERE tmp.id_parent = validacoes_limites_capacidade.id
                    ) 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->execute("DROP VIEW produto.v_limite_capacidade_utilizado_resumido;");

        $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
        );
    }
}
