<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class TaskInc65329 extends AbstractMigration
{
    public function up(): void
    {
        $this->execute("
                         CREATE TABLE manutencao.bkp_exclusao_cronometro_regulacao_historico AS
                               SELECT cronometro_regulacao_historico.*
                                 FROM log.cronometro_regulacao_historico
                                 JOIN sinistro.cronometro_regulacao
                                   ON cronometro_regulacao.id = cronometro_regulacao_historico.id_cronometro
                                 JOIN seguro.propostas_status
                                   ON propostas_status.id_proposta = cronometro_regulacao.id_proposta
                                  AND propostas_status.id_status = 8
                                  AND propostas_status.dt_criacao < '2025-12-10'
                                    ;
                      ");
  
        $this->execute("
                         CREATE TABLE manutencao.bkp_exclusao_cronometro_regulacao AS
                               SELECT cronometro_regulacao.*
                                 FROM sinistro.cronometro_regulacao
                                 JOIN seguro.propostas_status
                                   ON propostas_status.id_proposta = cronometro_regulacao.id_proposta
                                  AND propostas_status.id_status = 8
                                  AND propostas_status.dt_criacao < '2025-12-10'
                                    ;
                      ");
  
        $this->execute("
                         CREATE OR REPLACE FUNCTION manutencao.exclui_contador() RETURNS VOID AS $$
                         DECLARE
                             dtNovaLei   DATE := '2025-12-10';
                             stSQL       VARCHAR;
                             crCursor    REFCURSOR;
                             reRecord    RECORD;
                         BEGIN
                             stSQL := ' SELECT cronometro_regulacao_historico.id_cronometro
                                          FROM log.cronometro_regulacao_historico
                                          JOIN sinistro.cronometro_regulacao
                                            ON cronometro_regulacao.id = cronometro_regulacao_historico.id_cronometro
                                          JOIN seguro.propostas_status
                                            ON propostas_status.id_proposta = cronometro_regulacao.id_proposta
                                           AND propostas_status.id_status = 8
                                           AND propostas_status.dt_criacao < '|| quote_literal(dtNovaLei) ||'
                                             ;
                                      ';
                             OPEN crCursor FOR EXECUTE stSQL;
                             LOOP
                                 FETCH crCursor INTO reRecord;
                                 EXIT WHEN NOT FOUND;
                             
                                 DELETE FROM log.cronometro_regulacao_historico WHERE cronometro_regulacao_historico.id_cronometro = reRecord.id_cronometro;
                             END LOOP;
                             CLOSE crCursor;
                         
                             stSQL := ' SELECT cronometro_regulacao.id
                                          FROM sinistro.cronometro_regulacao
                                          JOIN seguro.propostas_status
                                            ON propostas_status.id_proposta = cronometro_regulacao.id_proposta
                                           AND propostas_status.id_status = 8
                                           AND propostas_status.dt_criacao < '|| quote_literal(dtNovaLei) ||'
                                             ;
                                      ';
                             OPEN crCursor FOR EXECUTE stSQL;
                             LOOP
                                 FETCH crCursor INTO reRecord;
                                 EXIT WHEN NOT FOUND;
                             
                                 DELETE FROM sinistro.cronometro_regulacao WHERE cronometro_regulacao.id = reRecord.id;
                             END LOOP;
                             CLOSE crCursor;
                         
                         END;
                         $$ LANGUAGE 'plpgsql';
                         
                         SELECT manutencao.exclui_contador();
                         DROP FUNCTION manutencao.exclui_contador();

                      ");
    }

    public function down(): void
    {
        $this->execute("INSERT INTO sinistro.cronometro_regulacao      SELECT * FROM manutencao.bkp_exclusao_cronometro_regulacao");
        $this->execute("INSERT INTO log.cronometro_regulacao_historico SELECT * FROM manutencao.bkp_exclusao_cronometro_regulacao_historico");
    }
}
