<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class TaskInc70796 extends AbstractMigration
{
    public function up(): void
    {
        $this->execute("
                         CREATE OR REPLACE FUNCTION produto.get_cobertura_i4pro_by_aviso(in_id_aviso  INTEGER)
                                                                                         RETURNS      INTEGER AS $$
                         DECLARE
                             cd_cobertura_seguradora INTEGER;
                         BEGIN
                               SELECT CASE
                                          WHEN extract (YEAR from coalesce(proposta_mae.dt_transmissao, now())) >= 2025 THEN
                                              COALESCE(coberturas_i4pro.cd_cobertura_seguradora_novo,produtos_coberturas.cd_cobertura_seguradora)
                                          ELSE
                                              coberturas_i4pro.cd_cobertura_seguradora_antigo
                                      END AS cd_cobertura_seguradora
                                 INTO cd_cobertura_seguradora
                                 FROM sinistro.avisos
                                 JOIN sinistro.avisos_eventos
                                   ON avisos_eventos.id_aviso = avisos.id
                                 JOIN seguro.propostas 
                                   ON propostas.id = avisos.id_proposta
                                 JOIN seguro.propostas     AS proposta_mae
                                   ON proposta_mae.id = propostas.id_proposta_mae
                                 JOIN produto.produtos_coberturas_eventos
                                   ON produtos_coberturas_eventos.id_produto = propostas.id_produto
                                  AND produtos_coberturas_eventos.id_evento  = avisos_eventos.id_evento
                                 JOIN seguro.propostas_coberturas
                                   ON propostas_coberturas.id_proposta  = propostas.id
                                  AND propostas_coberturas.id_cobertura = produtos_coberturas_eventos.id_cobertura
                                 JOIN produto.produtos_coberturas
                                   ON produtos_coberturas.id_cobertura  = produtos_coberturas_eventos.id_cobertura
                                  AND produtos_coberturas.id_produto    = produtos_coberturas_eventos.id_produto
                                  AND produtos_coberturas.id_cobertura != 30
                            LEFT JOIN produto.coberturas_i4pro
                                   ON coberturas_i4pro.cd_cobertura_seguradora_antigo = produtos_coberturas.cd_cobertura_seguradora
                                WHERE avisos.id = in_id_aviso
                                    ;
                            RETURN cd_cobertura_seguradora;
                         END;
                         $$ LANGUAGE 'plpgsql';
                      ");
    }

    public function down(): void
    {
        $this->execute("
                         CREATE OR REPLACE FUNCTION produto.get_cobertura_i4pro_by_aviso(in_id_aviso integer)
                                                                                         RETURNS     integer AS $$
                         DECLARE
                             cd_cobertura_seguradora INTEGER;
                         BEGIN
                                SELECT CASE WHEN extract (YEAR from coalesce(pr_mae.dt_transmissao, now())) >= 2025
                                              THEN COALESCE(ci.cd_cobertura_seguradora_novo,p.cd_cobertura_seguradora)
                                              ELSE ci.cd_cobertura_seguradora_antigo
                                          END AS cd_cobertura_seguradora
                                  INTO cd_cobertura_seguradora
                                  FROM sinistro.avisos
                                  JOIN sinistro.avisos_eventos ON avisos_eventos.id_aviso = avisos.id
                                  JOIN seguro.propostas pr ON pr.id = avisos.id_proposta
                                  JOIN seguro.propostas pr_mae ON pr_mae.id = pr.id_proposta_mae
                                  JOIN produto.produtos_coberturas_eventos pce ON pce.id_produto = pr.id_produto AND pce.id_evento = avisos_eventos.id_evento
                                  JOIN seguro.propostas_coberturas pc ON pc.id_proposta = pr.id AND pc.id_cobertura = pce.id_cobertura
                                  JOIN produto.coberturas p ON p.id = pc.id_cobertura
                             LEFT JOIN produto.coberturas_i4pro ci ON ci.cd_cobertura_seguradora_antigo = p.cd_cobertura_seguradora
                                 WHERE avisos.id = in_id_aviso
                                     ;
                             RETURN cd_cobertura_seguradora;
                         END;
                         $$ LANGUAGE 'plpgsql';
                      ");
    }
}
