<?php

declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class TaskSr59845 extends AbstractMigration
{
    public function up()
    {
        $this->execute(<<<SQL
            INSERT INTO sistema.configuracao_sistema (ds_nome, ds_valor, id_usuario_criacao)
            VALUES('DATA_INICIO_NOVA_LEI_SEGURO', '2025-12-10', 2068);

            -- CONFIGURAÇÃO PRODUTO

            CREATE TABLE produto.produto_config (
                id SERIAL PRIMARY KEY,
                id_produto INTEGER NOT NULL,
                ds_url_condicoes VARCHAR(255) NOT NULL,
                ds_frase_restricoes TEXT,
                ds_frase_risco TEXT,
                ds_frase_padrao_orcamento TEXT,
                id_modelo_vistoria_previa INTEGER NULL DEFAULT NULL,
                CONSTRAINT fk_id_produto FOREIGN KEY (id_produto) REFERENCES produto.produtos (id),
                CONSTRAINT fk_id_modelo_vistoria_previa FOREIGN KEY (id_modelo_vistoria_previa) REFERENCES seguro.modelos_laudos_previas (id)
            ) INHERITS (public.campos_default);

            INSERT INTO produto.produto_config (id_produto, ds_url_condicoes, ds_frase_restricoes, ds_frase_risco, ds_frase_padrao_orcamento, id_modelo_vistoria_previa, id_usuario_criacao)
            SELECT
                id,
                ds_url_condicoes,
                ds_frase_restricoes,
                ds_frase_risco,
                ds_frase_padrao_orcamento,
                CASE WHEN id_modelo_vistoria_previa = 0
                    THEN NULL
                ELSE
                    id_modelo_vistoria_previa
                END as id_modelo_vistoria_previa,
                id_usuario_criacao
            FROM produto.produtos;

            ALTER TABLE produto.produtos_produtos_geral_renovacao
            ADD COLUMN id_produto_config INTEGER;

            ALTER TABLE produto.produtos_produtos_geral_renovacao
            ADD CONSTRAINT fk_id_produto_config FOREIGN KEY (id_produto_config) REFERENCES produto.produto_config (id);

            UPDATE produto.produtos_produtos_geral_renovacao
            SET id_produto_config = produto_config.id
            FROM produto.produto_config
            WHERE produto_config.id_produto = produtos_produtos_geral_renovacao.id_produto;

            ALTER TABLE produto.produtos DROP COLUMN id_modelo_vistoria_previa;
            ALTER TABLE produto.produtos DROP COLUMN ds_url_condicoes;
            ALTER TABLE produto.produtos DROP COLUMN ds_frase_restricoes;
            ALTER TABLE produto.produtos DROP COLUMN ds_frase_risco;
            ALTER TABLE produto.produtos DROP COLUMN ds_frase_padrao_orcamento;

            -- CONFIGURAÇÃO COBERTURA
            CREATE TABLE produto.produto_cobertura_config (
                id SERIAL PRIMARY KEY,
                id_produto INTEGER NOT NULL,
                id_cobertura INTEGER NOT NULL,
                ds_frase_outros_riscos_excluidos TEXT,
                ds_frase_condicoes_particulares TEXT,
                CONSTRAINT fk_id_produto FOREIGN KEY (id_produto) REFERENCES produto.produtos (id),
                CONSTRAINT fk_id_cobertura FOREIGN KEY (id_cobertura) REFERENCES produto.coberturas (id)
            ) INHERITS (public.campos_default);

            INSERT INTO produto.produto_cobertura_config (id_produto, id_cobertura, ds_frase_outros_riscos_excluidos, ds_frase_condicoes_particulares, id_usuario_criacao)
            SELECT
                id_produto,
                id_cobertura,
                ds_frase_outros_riscos_excluidos,
                ds_frase_condicoes_particulares,
                id_usuario_criacao
            FROM produto.produtos_coberturas;

            ALTER TABLE produto.produtos_coberturas DROP COLUMN ds_frase_outros_riscos_excluidos;
            ALTER TABLE produto.produtos_coberturas DROP COLUMN ds_frase_condicoes_particulares;
SQL
        );
    }

    public function down()
    {
        $this->execute(<<<SQL
            DELETE FROM sistema.configuracao_sistema WHERE ds_nome = 'DATA_INICIO_NOVA_LEI_SEGURO';
            
            -- CONFIGURAÇÃO PRODUTO
            DELETE FROM produto.produtos_produtos_geral_renovacao WHERE id_produto_config IN (SELECT id FROM produto.produto_config WHERE fl_ativo IS FALSE);
            ALTER TABLE produto.produtos_produtos_geral_renovacao DROP COLUMN id_produto_config;

            ALTER TABLE produto.produtos ADD COLUMN id_modelo_vistoria_previa INTEGER;
            ALTER TABLE produto.produtos ADD COLUMN ds_url_condicoes VARCHAR(255) NOT NULL DEFAULT '';
            ALTER TABLE produto.produtos ADD COLUMN ds_frase_restricoes TEXT;
            ALTER TABLE produto.produtos ADD COLUMN ds_frase_risco TEXT;
            ALTER TABLE produto.produtos ADD COLUMN ds_frase_padrao_orcamento TEXT;

            UPDATE produto.produtos
            SET id_modelo_vistoria_previa = produto_config.id_modelo_vistoria_previa,
                ds_url_condicoes = produto_config.ds_url_condicoes,
                ds_frase_restricoes = produto_config.ds_frase_restricoes,
                ds_frase_risco = produto_config.ds_frase_risco,
                ds_frase_padrao_orcamento = produto_config.ds_frase_padrao_orcamento
            FROM produto.produto_config
            WHERE produto_config.id_produto = produtos.id AND produto_config.fl_ativo IS TRUE;
            
            DROP TABLE produto.produto_config;

            --CONFIGURAÇÃO COBERTURA

            ALTER TABLE produto.produtos_coberturas ADD COLUMN ds_frase_outros_riscos_excluidos TEXT;
            ALTER TABLE produto.produtos_coberturas ADD COLUMN ds_frase_condicoes_particulares TEXT;

            UPDATE produto.produtos_coberturas
            SET ds_frase_outros_riscos_excluidos = produto_cobertura_config.ds_frase_outros_riscos_excluidos,
                ds_frase_condicoes_particulares = produto_cobertura_config.ds_frase_condicoes_particulares
            FROM produto.produto_cobertura_config
            WHERE produto_cobertura_config.id_produto = produtos_coberturas.id_produto 
                AND produto_cobertura_config.id_cobertura = produtos_coberturas.id_cobertura 
                AND produto_cobertura_config.fl_ativo IS TRUE;
            
            DROP TABLE produto.produto_cobertura_config;
SQL
        );
    }
}
