<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class TaskSr50258 extends AbstractMigration
{
    public function up(): void
    {
        $this->upCoberturas();
        $this->upEventos();
        $this->upDeParaCoberturasPL();
        $this->upDeParaEventosPL();
    }

    public function down(): void
    {
        $this->execute(<<<SQL
            DROP FUNCTION produto.de_para_eventos_i4pro;
            DROP FUNCTION produto.de_para_coberturas_i4pro;
            DROP TABLE produto.coberturas_i4pro;
            DROP TABLE produto.eventos_i4pro;
SQL
        );
    }

    private function upCoberturas(): void
    {
        $this->execute(<<<SQL

            CREATE TABLE produto.coberturas_i4pro (
                id SERIAL,
                cd_cobertura_seguradora_antigo INT NOT NULL,
                cd_cobertura_seguradora_novo INT NOT NULL,
                UNIQUE (cd_cobertura_seguradora_antigo, cd_cobertura_seguradora_novo)
            ) INHERITS (public.campos_default);

            INSERT INTO produto.coberturas_i4pro (id_usuario_criacao, dt_criacao, cd_cobertura_seguradora_antigo, cd_cobertura_seguradora_novo)
                VALUES (2068, now(),240, 2291),
                       (2068, now(),238, 2289),
                       (2068, now(),239, 2290),
                       (2068, now(),251, 2302),
                       (2068, now(),254, 2305),
                       (2068, now(),241, 2292),
                       (2068, now(),242, 2293),
                       (2068, now(),236, 2287),
                       (2068, now(),237, 2288),
                       (2068, now(),252, 2303),
                       (2068, now(),248, 2299),
                       (2068, now(),253, 2304),
                       (2068, now(),246, 2297),
                       (2068, now(),245, 2296),
                       (2068, now(),247, 2298),
                       (2068, now(),233, 2284),
                       (2068, now(),244, 2295),
                       (2068, now(),255, 2306),
                       (2068, now(),232, 2283),
                       (2068, now(),234, 2285),
                       (2068, now(),249, 2300),
                       (2068, now(),250, 2301),
                       (2068, now(),243, 2294),
                       (2068, now(),235, 2286),
                       (2068, now(),339, 2311),
                       (2068, now(),340, 2282),
                       (2068, now(),341, 2313),
                       (2068, now(),342, 2312),
                       (2068, now(),520, 2314),
                       (2068, now(),551, 2315),
                       (2068, now(),647, 2307),
                       (2068, now(),648, 2308),
                       (2068, now(),2169, 2309),
                       (2068, now(),2170, 2310);
SQL
        );
    }

    private function upEventos(): void
    {
        $this->execute(<<<SQL
            CREATE TABLE produto.eventos_i4pro (
                id SERIAL,
                cd_evento_seguradora_antigo INT NOT NULL,
                cd_evento_seguradora_novo INT NOT NULL,
                UNIQUE (cd_evento_seguradora_antigo, cd_evento_seguradora_novo)
            ) INHERITS (public.campos_default);

            INSERT INTO produto.eventos_i4pro (id_usuario_criacao, dt_criacao, cd_evento_seguradora_antigo, cd_evento_seguradora_novo)
                VALUES (2068, now(), 7253, 15535),
                       (2068, now(), 7254, 15540),
                       (2068, now(), 7255, 15541),
                       (2068, now(), 7256, 15526),
                       (2068, now(), 7257, 15527),
                       (2068, now(), 7258, 15532),
                       (2068, now(), 7259, 15533),
                       (2068, now(), 7260, 15528),
                       (2068, now(), 7261, 15529),
                       (2068, now(), 7262, 15530),
                       (2068, now(), 7263, 15531),
                       (2068, now(), 7264, 15536),
                       (2068, now(), 7265, 15537),
                       (2068, now(), 7266, 15534),
                       (2068, now(), 7267, 15538),
                       (2068, now(), 7268, 15539),
                       (2068, now(), 7269, 15509),
                       (2068, now(), 7270, 15510),
                       (2068, now(), 7418, 15515),
                       (2068, now(), 7271, 15511),
                       (2068, now(), 7272, 15513),
                       (2068, now(), 7273, 15512),
                       (2068, now(), 7274, 15514),
                       (2068, now(), 7275, 15518),
                       (2068, now(), 7276, 15519),
                       (2068, now(), 7277, 15520),
                       (2068, now(), 7278, 15521),
                       (2068, now(), 7279, 15522),
                       (2068, now(), 7419, 15525),
                       (2068, now(), 7280, 15523),
                       (2068, now(), 7281, 15524),
                       (2068, now(), 7282, 15516),
                       (2068, now(), 7283, 15517),
                       (2068, now(), 7448, 15573),
                       (2068, now(), 7449, 15574),
                       (2068, now(), 7450, 15575),
                       (2068, now(), 7451, 15576),
                       (2068, now(), 7452, 15577),
                       (2068, now(), 7453, 15578),
                       (2068, now(), 16947, 16948),
                       (2068, now(), 7466, 15591),
                       (2068, now(), 7467, 15592),
                       (2068, now(), 7468, 15593),
                       (2068, now(), 7469, 15594),
                       (2068, now(), 7470, 15595),
                       (2068, now(), 7471, 15596),
                       (2068, now(), 7472, 15597),
                       (2068, now(), 7473, 15598),
                       (2068, now(), 7474, 15599),
                       (2068, now(), 16945, 16946),
                       (2068, now(), 7421, 15542),
                       (2068, now(), 7422, 15543),
                       (2068, now(), 7423, 15544),
                       (2068, now(), 7424, 15545),
                       (2068, now(), 7425, 15546),
                       (2068, now(), 7416, 15507),
                       (2068, now(), 7417, 15508),
                       (2068, now(), 7454, 15579),
                       (2068, now(), 7455, 15580),
                       (2068, now(), 16939, 16940),
                       (2068, now(), 16937, 16938),
                       (2068, now(), 7445, 15570),
                       (2068, now(), 7456, 15581),
                       (2068, now(), 7457, 15582),
                       (2068, now(), 7458, 15583),
                       (2068, now(), 7459, 15584),
                       (2068, now(), 7460, 15585),
                       (2068, now(), 7461, 15586),
                       (2068, now(), 7462, 15587),
                       (2068, now(), 7463, 15588),
                       (2068, now(), 7464, 15589),
                       (2068, now(), 7465, 15590),
                       (2068, now(), 7439, 15564),
                       (2068, now(), 7440, 15565),
                       (2068, now(), 7441, 15566),
                       (2068, now(), 7442, 15567),
                       (2068, now(), 7443, 15568),
                       (2068, now(), 7436, 15561),
                       (2068, now(), 7437, 15562),
                       (2068, now(), 7438, 15563),
                       (2068, now(), 7444, 15569),
                       (2068, now(), 7284, 15501),
                       (2068, now(), 7285, 15502),
                       (2068, now(), 7414, 15500),
                       (2068, now(), 7286, 15503),
                       (2068, now(), 7287, 15505),
                       (2068, now(), 7288, 15504),
                       (2068, now(), 7427, 15552),
                       (2068, now(), 7428, 15553),
                       (2068, now(), 7429, 15554),
                       (2068, now(), 7430, 15555),
                       (2068, now(), 7431, 15556),
                       (2068, now(), 7432, 15557),
                       (2068, now(), 7433, 15558),
                       (2068, now(), 7435, 15560),
                       (2068, now(), 7434, 15559),
                       (2068, now(), 7289, 15600),
                       (2068, now(), 7290, 15601),
                       (2068, now(), 7291, 15602),
                       (2068, now(), 7292, 15603),
                       (2068, now(), 7293, 15604),
                       (2068, now(), 7294, 15605),
                       (2068, now(), 16913, 16914),
                       (2068, now(), 7475, 15606),
                       (2068, now(), 7413, 15499),
                       (2068, now(), 7415, 15506),
                       (2068, now(), 7446, 15571),
                       (2068, now(), 16943, 16944),
                       (2068, now(), 16941, 16942),
                       (2068, now(), 7447, 15572),
                       (2068, now(), 7295, 15548),
                       (2068, now(), 7296, 15549),
                       (2068, now(), 7297, 15550),
                       (2068, now(), 7298, 15547),
                       (2068, now(), 7426, 15551),
                       (2068, now(), 16933, 16934),
                       (2068, now(), 16935, 16936),
                       (2068, now(), 8619, 15498),
                       (2068, now(), 16917, 16918),
                       (2068, now(), 16919, 16920),
                       (2068, now(), 16921, 16922),
                       (2068, now(), 16923, 16924),
                       (2068, now(), 16925, 16926),
                       (2068, now(), 16927, 16928),
                       (2068, now(), 16931, 16932),
                       (2068, now(), 16929, 16930),
                       (2068, now(), 8303, 15607),
                       (2068, now(), 9143, 15609),
                       (2068, now(), 9144, 15608),
                       (2068, now(), 9109, 15612),
                       (2068, now(), 9113, 15615),
                       (2068, now(), 9111, 15616),
                       (2068, now(), 9105, 15610),
                       (2068, now(), 9108, 15611),
                       (2068, now(), 9110, 15613),
                       (2068, now(), 9106, 15618),
                       (2068, now(), 9107, 15619),
                       (2068, now(), 9112, 15614),
                       (2068, now(), 9114, 15617),
                       (2068, now(), 15333, 15620),
                       (2068, now(), 15334, 15621),
                       (2068, now(), 15335, 15622),
                       (2068, now(), 15336, 15623),
                       (2068, now(), 15337, 15624),
                       (2068, now(), 15338, 15625),
                       (2068, now(), 15339, 15626),
                       (2068, now(), 15340, 15630),
                       (2068, now(), 15341, 15631),
                       (2068, now(), 15342, 15632),
                       (2068, now(), 15343, 15633),
                       (2068, now(), 15344, 15627),
                       (2068, now(), 15345, 15628),
                       (2068, now(), 16915, 16916),
                       (2068, now(), 15346, 15629);
SQL
    );
    }

    private function upDeParaCoberturasPL()
    {
        $this->execute(<<<SQL
            CREATE OR REPLACE FUNCTION produto.de_para_coberturas_i4pro(in_id_proposta INTEGER, p_cd_cobertura_seguradora INTEGER) RETURNS INTEGER
            LANGUAGE plpgsql
            AS
            $$
            DECLARE
                cd_cobertura_seguradora INTEGER;
            BEGIN
                SELECT CASE WHEN extract (YEAR from coalesce(pr.dt_transmissao, now())) >= 2025
                            THEN ci.cd_cobertura_seguradora_novo
                            ELSE ci.cd_cobertura_seguradora_antigo
                        END INTO cd_cobertura_seguradora
                FROM seguro.propostas pr
                JOIN produto.produtos_coberturas pc ON pc.id_produto = pr.id_produto
                JOIN produto.coberturas_i4pro ci ON ci.cd_cobertura_seguradora_antigo = pc.cd_cobertura_seguradora
                WHERE pr.id = (SELECT id_proposta_mae FROM seguro.propostas WHERE id = in_id_proposta)
                AND pc.cd_cobertura_seguradora = p_cd_cobertura_seguradora;

                IF cd_cobertura_seguradora IS NOT NULL THEN
                    RETURN cd_cobertura_seguradora;
                END IF;

                RETURN p_cd_cobertura_seguradora;
            END;
            $$;
SQL
        );
    }

    private function upDeParaEventosPL()
    {
        $this->execute(<<<SQL
            CREATE OR REPLACE FUNCTION produto.de_para_eventos_i4pro(in_id_proposta INTEGER, in_cd_evento_seguradora INTEGER) RETURNS INTEGER
            LANGUAGE plpgsql
            AS
            $$
            DECLARE
                cd_evento_seguradora INTEGER;
            BEGIN

                SELECT CASE WHEN extract (YEAR from coalesce(pr.dt_transmissao, now())) >= 2025
                            THEN ei.cd_evento_seguradora_novo
                            ELSE ei.cd_evento_seguradora_antigo
                        END INTO cd_evento_seguradora
                  FROM seguro.propostas pr
                  JOIN produto.produtos_coberturas_eventos pce ON pce.id_produto = pr.id_produto
                  JOIN produto.coberturas_eventos pe ON pe.id_cobertura = pce.id_cobertura AND pe.id_evento = pce.id_evento
                  JOIN produto.eventos_i4pro ei ON ei.cd_evento_seguradora_antigo = pe.cd_evento_seguradora
                 WHERE pr.id = (SELECT id_proposta_mae FROM seguro.propostas WHERE id = in_id_proposta)
                   AND pe.cd_evento_seguradora = in_cd_evento_seguradora;

                IF cd_evento_seguradora IS NOT NULL THEN
                    RETURN cd_evento_seguradora;
                END IF;

                RETURN in_cd_evento_seguradora;
            END;
            $$;
SQL
        );
    }
}
