<?php

declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class TaskSr63591 extends AbstractMigration
{
    public function up()
    {
        $this->execute(<<<SQL
            INSERT INTO produto.tipo_atributo (ds_chave_tipo_atributo, ds_descricao_tipo_atributo, id_usuario_criacao)
                VALUES (
                    'select_autocomplete',
                    'Seleção com Autocomplete',
                    2068
                );

            INSERT INTO sistema.configuracao_sistema (ds_nome, ds_valor) VALUES ('DATA_CAR_OBRIGATORIO', '2026-04-28');

            INSERT INTO produto.atributos_rn (
                id_atributo_modulo,
                ds_chave_rn,
                ds_descricao_atributo,
                fl_permite_exclusao,
                id_tipo_atributo,
                ds_ordem,
                fl_required,
                fl_atendimento
            ) VALUES (
                3,
                'IS_CAR',
                'CAR',
                false,
                (SELECT id FROM produto.tipo_atributo WHERE ds_chave_tipo_atributo = 'select_autocomplete'),
                (SELECT MAX(ds_ordem) + 1 FROM produto.atributos_rn),
                false,
                false
            );

            INSERT INTO produto.produtos_atributos_rn (id_atributo_rn, id_grupo_atributo_rn, ds_valor)
                SELECT
                    (SELECT id FROM produto.atributos_rn WHERE ds_chave_rn = 'IS_CAR'),
                    produtos_grupos_atributos_rn.id AS id_grupo,
                    1 AS valor
                FROM produto.produtos
                INNER JOIN produto.produtos_grupos_atributos_rn
                    ON produtos_grupos_atributos_rn.id_produto = produtos.id
                WHERE
                    produtos.id_safra = 29
                    AND produtos_grupos_atributos_rn.ds_tipo = 'u';

            ALTER TABLE seguro.itens_segurados_car ADD COLUMN fl_selecionado BOOLEAN DEFAULT FALSE;
            ALTER TABLE seguro.itens_segurados_car ADD COLUMN fl_manual BOOLEAN DEFAULT FALSE;
            ALTER TABLE seguro.itens_segurados_car ADD COLUMN ds_arquivo_car_manual VARCHAR(255);
            ALTER TABLE seguro.itens_segurados_car ADD COLUMN fl_car_manual_aprovado BOOLEAN DEFAULT FALSE;
            ALTER TABLE seguro.itens_segurados_car ADD COLUMN id_usuario_aprovacao_car INTEGER DEFAULT NULL;
            ALTER TABLE seguro.itens_segurados DROP COLUMN ds_car;

            UPDATE produto.atributos_rn SET ds_ordem = ds_ordem + 1 WHERE id_atributo_modulo = 3 AND ds_ordem >= 26 AND ds_ordem < 50;
            UPDATE produto.atributos_rn SET ds_ordem = 26 WHERE ds_chave_rn = 'IS_CAR';

            
            UPDATE seguro.itens_segurados_car isc
            SET fl_selecionado = TRUE
            WHERE isc.id IN (
                SELECT MIN(isc2.id)
                FROM seguro.itens_segurados_car isc2
                WHERE isc2.fl_selecionado = FALSE
                AND NOT EXISTS (
                    SELECT 1
                    FROM seguro.itens_segurados_car isc3
                    WHERE isc3.id_item_segurado = isc2.id_item_segurado
                        AND isc3.fl_selecionado = TRUE
                )
                GROUP BY isc2.id_item_segurado
            );
            
            UPDATE seguro.itens_segurados_car SET ds_car = regexp_replace(ds_car, '[-.]', '', 'g');
            
            UPDATE comercializacao.taxas_agrupamento_car SET ds_car = regexp_replace(ds_car, '[-.]', '', 'g');

            UPDATE seguro.propriedade_car_restricao SET ds_car = regexp_replace(ds_car, '[-.]', '', 'g');

            CREATE OR REPLACE VIEW seguro.v_unidades_seguradas AS
                SELECT i.id,
                    to_char(ic.dt_final_colheita::timestamp with time zone, 'DD/MM/YYYY'::text) AS is_dt_final_colheita,
                    to_char(ic.dt_inicio_colheita::timestamp with time zone, 'DD/MM/YYYY'::text) AS is_dt_inicio_colheita,
                    i.id_proposta,
                    i.vl_area AS is_area,
                    i.nr_item_segurado AS is_item,
                    i.ds_item_segurado AS is_descricao_item,
                    i.vl_idade AS is_idade,
                    i.ds_espacamento AS is_espacamento_simples,
                    i.nr_plantas AS is_nro_plantas,
                    i.vl_producao_planta AS is_producao_planta,
                    i.vl_valor_tonelada AS is_valor_tonelada,
                    i.vl_valor_custeio AS is_valor_custeio,
                    i.vl_rendimento_tonelada AS is_produtividade,
                    i.vl_lmga AS is_lmga_parcial,
                    v.ds_nome_variedade AS is_nome_variedades,
                    v.id AS is_variedades,
                    pe.ds_nome_portaenxerto AS is_nome_portaenxerto,
                    pe.id AS is_portaenxerto,
                    ic.id_ciclo AS is_ciclo_variedade,
                    ic.ds_tipo_conducao AS is_tipo_conducao,
                    to_char(ic.dt_plantio::timestamp with time zone, 'dd/mm/yyyy'::text) AS is_data_plantio_transplante,
                    to_char(ic.dt_semeadura::timestamp with time zone, 'dd/mm/yyyy'::text) AS is_data_semeadura,
                    to_char(ic.dt_poda::timestamp with time zone, 'dd/mm/yyyy'::text) AS is_data_poda,
                    ic.nr_plantas_metro_linear AS is_nro_plantas_m_linear,
                    ic.vl_producao_minima AS is_producao_minima,
                    ic.vl_lmi_pos_granizo AS is_lmi_pos_granizo,
                    ic.vl_producao_garantida AS is_producao_garantida,
                    ic.vl_idade_tela AS is_idade_tela,
                    ic.ds_local AS is_local,
                    ic.ds_coordenadas_geograficas AS is_coordenadas_geograficas,
                    ic.ds_primeiro_ano_plantio AS is_primeiro_ano_plantio,
                    ic.vl_altitude AS is_altitude,
                    ic.id_tipo_solo AS is_tipo_solo,
                        CASE
                            WHEN ic.id_sistema_plantio = 1 THEN 'Direto'::text
                            WHEN ic.id_sistema_plantio = 2 THEN 'Convencional'::text
                            WHEN ic.id_sistema_plantio = 3 THEN 'A Lanço'::text
                            ELSE NULL::text
                        END AS is_sistema_plantio,
                    ic.id_sistema_plantio AS is_id_sistema_plantio,
                    cic.ds_nome_ciclo AS is_ciclo,
                    v.cd_variedade_seguradora,
                    cic.cd_ciclo_seguradora,
                    ic.ds_paf AS is_pequena_area_forrageira,
                    i.fl_importado_previa,
                    sisc.ds_car AS is_car
                FROM seguro.itens_segurados i
                    JOIN produto.variedades v ON i.id_variedade = v.id
                    JOIN seguro.itens_segurados_complemento ic ON i.id = ic.id_item_segurado
                    JOIN produto.ciclos cic ON ic.id_ciclo = cic.id
                    LEFT JOIN seguro.itens_segurados_car sisc
                        ON sisc.id_item_segurado = i.id
                            AND fl_selecionado IS TRUE
                    LEFT JOIN produto.portaenxertos pe ON ic.id_portaenxerto = pe.id
                ORDER BY i.nr_item_segurado;
SQL
        );
    }

    public function down()
    {
        $this->execute(<<<SQL
            DELETE FROM produto.produtos_atributos_rn WHERE id_atributo_rn IN (
                SELECT id FROM produto.atributos_rn WHERE ds_chave_rn = 'IS_CAR'
            );

            DELETE FROM sistema.configuracao_sistema WHERE ds_nome = 'DATA_CAR_OBRIGATORIO';

            DELETE FROM produto.atributos_rn WHERE ds_chave_rn = 'IS_CAR';
            DELETE FROM produto.tipo_atributo WHERE ds_chave_tipo_atributo = 'select_autocomplete';

            ALTER TABLE seguro.itens_segurados_car DROP COLUMN fl_selecionado;
            ALTER TABLE seguro.itens_segurados_car DROP COLUMN fl_manual;
            ALTER TABLE seguro.itens_segurados_car DROP COLUMN id_usuario_aprovacao_car;
            ALTER TABLE seguro.itens_segurados ADD COLUMN ds_car VARCHAR(60);

            DROP TABLE seguro.item_segurado_car_manual_arquivo;

            UPDATE seguro.itens_segurados_car
            SET ds_car =
            REGEXP_REPLACE(
                UPPER(REGEXP_REPLACE(ds_car, '[^A-Za-z0-9]', '', 'g')),
                '^([A-Z]{2})(\d{7})([A-F0-9]{32})$',
                '\1-\2-\3'
            );

            UPDATE comercializacao.taxas_agrupamento_car
            SET ds_car =
            REGEXP_REPLACE(
                UPPER(REGEXP_REPLACE(ds_car, '[^A-Za-z0-9]', '', 'g')),
                '^([A-Z]{2})(\d{7})([A-F0-9]{32})$',
                '\1-\2-\3'
            );

            UPDATE seguro.propriedade_car_restricao
            SET ds_car =
            REGEXP_REPLACE(
                UPPER(REGEXP_REPLACE(ds_car, '[^A-Za-z0-9]', '', 'g')),
                '^([A-Z]{2})(\d{7})([A-F0-9]{32})$',
                '\1-\2-\3'
            );

            CREATE OR REPLACE VIEW seguro.v_unidades_seguradas AS
                SELECT i.id,
                    to_char(ic.dt_final_colheita::timestamp with time zone, 'DD/MM/YYYY'::text) AS is_dt_final_colheita,
                    to_char(ic.dt_inicio_colheita::timestamp with time zone, 'DD/MM/YYYY'::text) AS is_dt_inicio_colheita,
                    i.id_proposta,
                    i.vl_area AS is_area,
                    i.nr_item_segurado AS is_item,
                    i.ds_item_segurado AS is_descricao_item,
                    i.vl_idade AS is_idade,
                    i.ds_espacamento AS is_espacamento_simples,
                    i.nr_plantas AS is_nro_plantas,
                    i.vl_producao_planta AS is_producao_planta,
                    i.vl_valor_tonelada AS is_valor_tonelada,
                    i.vl_valor_custeio AS is_valor_custeio,
                    i.vl_rendimento_tonelada AS is_produtividade,
                    i.vl_lmga AS is_lmga_parcial,
                    v.ds_nome_variedade AS is_nome_variedades,
                    v.id AS is_variedades,
                    pe.ds_nome_portaenxerto AS is_nome_portaenxerto,
                    pe.id AS is_portaenxerto,
                    ic.id_ciclo AS is_ciclo_variedade,
                    ic.ds_tipo_conducao AS is_tipo_conducao,
                    to_char(ic.dt_plantio::timestamp with time zone, 'dd/mm/yyyy'::text) AS is_data_plantio_transplante,
                    to_char(ic.dt_semeadura::timestamp with time zone, 'dd/mm/yyyy'::text) AS is_data_semeadura,
                    to_char(ic.dt_poda::timestamp with time zone, 'dd/mm/yyyy'::text) AS is_data_poda,
                    ic.nr_plantas_metro_linear AS is_nro_plantas_m_linear,
                    ic.vl_producao_minima AS is_producao_minima,
                    ic.vl_lmi_pos_granizo AS is_lmi_pos_granizo,
                    ic.vl_producao_garantida AS is_producao_garantida,
                    ic.vl_idade_tela AS is_idade_tela,
                    ic.ds_local AS is_local,
                    ic.ds_coordenadas_geograficas AS is_coordenadas_geograficas,
                    ic.ds_primeiro_ano_plantio AS is_primeiro_ano_plantio,
                    ic.vl_altitude AS is_altitude,
                    ic.id_tipo_solo AS is_tipo_solo,
                        CASE
                            WHEN ic.id_sistema_plantio = 1 THEN 'Direto'::text
                            WHEN ic.id_sistema_plantio = 2 THEN 'Convencional'::text
                            WHEN ic.id_sistema_plantio = 3 THEN 'A Lanço'::text
                            ELSE NULL::text
                        END AS is_sistema_plantio,
                    ic.id_sistema_plantio AS is_id_sistema_plantio,
                    cic.ds_nome_ciclo AS is_ciclo,
                    v.cd_variedade_seguradora,
                    cic.cd_ciclo_seguradora,
                    ic.ds_paf AS is_pequena_area_forrageira,
                    i.fl_importado_previa
                FROM seguro.itens_segurados i
                    JOIN produto.variedades v ON i.id_variedade = v.id
                    JOIN seguro.itens_segurados_complemento ic ON i.id = ic.id_item_segurado
                    JOIN produto.ciclos cic ON ic.id_ciclo = cic.id
                    LEFT JOIN produto.portaenxertos pe ON ic.id_portaenxerto = pe.id
                ORDER BY i.nr_item_segurado;
SQL
        );
    }
}
