<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class TaskInc58511V2 extends AbstractMigration
{
    public function up(): void
    {
        $this->execute("  CREATE TABLE manutencao.duplicidade_contratos_resseguro AS
                          SELECT propostas_contratos_resseguro.*
                            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
                               ;
                      ");
        $table = $this->table('manutencao.duplicidade_contratos_resseguro');
        $singleRow = [
                          'id_usuario_criacao'    => 1033
                        , 'dt_criacao'            => '2025-08-05 16:30:59-03'
                        , 'fl_ativo'              => 'TRUE'
                        , 'fl_del'                => 'FALSE'
                        , 'id'                    => 252628
                        , 'id_proposta'           => 1037541
                        , 'id_contrato_resseguro' => 5
                     ];
        $table->insert($singleRow)
              ->saveData();

        $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
                             ;
                      ");
    }
}
