<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class TaskInc58866 extends AbstractMigration
{
    public function up(): void
    {
        $table = $this->table('manutencao.duplicidade_contratos_resseguro');
        $table->addColumn('dt_exclusao_duplicidade', 'timestamp')
              ->save();

        $builder = $this->getQueryBuilder();
        $builder->update('manutencao.duplicidade_contratos_resseguro')
                ->set('dt_exclusao_duplicidade', '2025-08-27 10:40:05')
                ->where(['id >' => 1])
                ->execute();

        $this->execute("  INSERT
                            INTO manutencao.duplicidade_contratos_resseguro
                               ( id_usuario_criacao
                               , id_usuario_alteracao
                               , dt_criacao
                               , dt_alteracao
                               , fl_ativo
                               , fl_del
                               , id
                               , id_proposta
                               , id_contrato_resseguro
                               , dt_exclusao_duplicidade
                               )
                          SELECT propostas_contratos_resseguro.id_usuario_criacao
                               , propostas_contratos_resseguro.id_usuario_alteracao
                               , propostas_contratos_resseguro.dt_criacao
                               , propostas_contratos_resseguro.dt_alteracao
                               , propostas_contratos_resseguro.fl_ativo
                               , propostas_contratos_resseguro.fl_del
                               , propostas_contratos_resseguro.id
                               , propostas_contratos_resseguro.id_proposta
                               , propostas_contratos_resseguro.id_contrato_resseguro
                               , NOW() AS dt_exclusao_duplicidade
                            FROM seguro.propostas_contratos_resseguro
                            JOIN (
                                     SELECT MIN(id) AS id
                                          , id_proposta
                                       FROM seguro.propostas_contratos_resseguro
                                      WHERE id_proposta IN (
                                                               SELECT id_proposta
                                                                 FROM seguro.propostas_contratos_resseguro
                                                             GROUP BY 1
                                                               HAVING COUNT(1) > 1
                                                           )
                                   GROUP BY id_proposta
                                   ORDER BY id_proposta
                                 ) AS interna
                              ON interna.id          = propostas_contratos_resseguro.id
                             AND interna.id_proposta = propostas_contratos_resseguro.id_proposta
                               ;
                      ");

        $this->execute(" CREATE OR REPLACE FUNCTION manutencao.corrige_contratos_resseguro() RETURNS VOID AS $$
                         DECLARE
                            stSQL       VARCHAR;
                            crCursor    REFCURSOR;
                            reRecord    RECORD;
                         BEGIN
                            stSQL := '
                                          SELECT id
                                               , id_proposta
                                            FROM seguro.propostas_contratos_resseguro
                                           WHERE id_proposta IN (
                                                                    SELECT id_proposta
                                                                      FROM seguro.propostas_contratos_resseguro
                                                                  GROUP BY 1
                                                                    HAVING COUNT(1) > 1
                                                                )
                                        GROUP BY id
                                               , id_proposta
                                        ORDER BY id_proposta
                                     ';

                            OPEN crCursor FOR EXECUTE stSQL;
                            LOOP
                                FETCH crCursor INTO reRecord;
                                EXIT WHEN NOT FOUND;

                                DELETE
                                  FROM seguro.propostas_contratos_resseguro
                                 WHERE id          = reRecord.id
                                   AND id_proposta = reRecord.id_proposta
                                     ;
                            END LOOP;
                            CLOSE crCursor;
                         END;
                         $$ LANGUAGE 'plpgsql';
                      ");

        $this->execute("SELECT manutencao.corrige_contratos_resseguro()");
        $this->execute("DROP FUNCTION manutencao.corrige_contratos_resseguro()");
    }

    public function down(): void
    {
        $this->execute("INSERT
                          INTO seguro.propostas_contratos_resseguro
                             ( id_usuario_criacao
                             , dt_criacao
                             , id_usuario_alteracao
                             , dt_alteracao
                             , fl_ativo
                             , fl_del
                             , id
                             , id_proposta
                             , id_contrato_resseguro
                             )
                        SELECT id_usuario_criacao
                             , dt_criacao
                             , id_usuario_alteracao
                             , dt_alteracao
                             , fl_ativo
                             , fl_del
                             , id
                             , id_proposta
                             , id_contrato_resseguro
                          FROM manutencao.duplicidade_contratos_resseguro
                         WHERE dt_exclusao_duplicidade > '2025-08-27 10:40:05'
                             ;
                      ");
    }
}
