<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class Task2308251236 extends AbstractMigration
{
    public function up(): void
    {
        $this->execute("CREATE TABLE manutencao.corrige_historico_vpd_2308251236(
                         id_usuario_criacao          INTEGER     ,
                         id_usuario_alteracao        INTEGER     ,
                         dt_criacao                  DT_CRIACAO  ,
                         dt_alteracao                DT_ALTERACAO,
                         fl_ativo                    BOOLEAN     ,
                         fl_del                      BOOLEAN     ,
                         id                          INTEGER     ,
                         id_proposta_vistoria        INTEGER     ,
                         id_status                   INTEGER     ,
                         id_status_analise           INTEGER     ,
                         ds_motivo                   TEXT        ,
                         id_empresa                  INTEGER     ,
                         fl_necessario_endosso       BOOLEAN     ,
                         ds_justificativa_dispensa   TEXT        ,
                         id_status_alteracao         INTEGER     ,
                         id_pendencia                INTEGER
                        )
                        INHERITS (public.campos_default)
                        WITH ( OIDS=FALSE )
                      ");
        $this->execute("
                         CREATE OR REPLACE FUNCTION manutencao.corrige_historico_vpd() RETURNS VOID AS $$
                         DECLARE
                             inMaxIdAgendado         INTEGER;
                             inMinIdAnalisando       INTEGER;
                             inCountSemFotos         INTEGER;
                             dtTransmitidoTablet     TIMESTAMP;
                             stSQL                   VARCHAR;
                             crCursor                REFCURSOR;
                             reRecord                RECORD;
                         BEGIN
                             stSQL := '   SELECT propostas_vistorias_previas.id AS id_proposta_vistoria
                                            FROM seguro.propostas_vistorias_previas
                                            JOIN (
                                                     SELECT propostas_vistorias_previas_historico.id_proposta_vistoria
                                                       FROM seguro.propostas_vistorias_previas
                                                       JOIN seguro.propostas_vistorias_previas_historico
                                                         ON propostas_vistorias_previas_historico.id_proposta_vistoria = propostas_vistorias_previas.id
                                                        AND propostas_vistorias_previas_historico.id_status = 71
                                                        AND propostas_vistorias_previas_historico.dt_criacao > ''2023-01-01''
                                                        AND propostas_vistorias_previas_historico.id_usuario_criacao = 2068
                                                      WHERE to_char(propostas_vistorias_previas_historico.dt_criacao, ''YYYY-mm-DD HH24:MI:SS'') < to_char(propostas_vistorias_previas.dt_transmitido_tablet, ''YYYY-mm-DD HH24:MI:SS'')
                                                         OR (     to_char(propostas_vistorias_previas_historico.dt_criacao, ''YYYY-mm-DD HH24:MI:SS'') > to_char(propostas_vistorias_previas.dt_transmitido_tablet, ''YYYY-mm-DD HH24:MI:SS'')
                                                              AND propostas_vistorias_previas_historico.ds_motivo = ''Todos arquivos foto recebidos.''
                                                            )
                                                   GROUP BY propostas_vistorias_previas_historico.id_proposta_vistoria
                                                          , propostas_vistorias_previas.dt_transmitido_tablet
                                                          , propostas_vistorias_previas_historico.dt_criacao
                                                          , propostas_vistorias_previas.id_proposta
                                                 ) AS interna
                                              ON interna.id_proposta_vistoria = propostas_vistorias_previas.id
                                            JOIN seguro.propostas
                                              ON propostas.id = propostas_vistorias_previas.id_proposta
                                            JOIN produto.produtos
                                              ON produtos.id = propostas.id_produto
                                           WHERE 1 = 1
                                             AND propostas_vistorias_previas.fl_transmitido_tablet = TRUE
                                             AND produtos.id_safra                                 = 26
                                        GROUP BY propostas_vistorias_previas.id
                                        ORDER BY propostas_vistorias_previas.dt_criacao
                                               , propostas_vistorias_previas.id_proposta
                                      ';

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

                                 SELECT propostas_vistorias_previas.dt_transmitido_tablet
                                   INTO dtTransmitidoTablet
                                   FROM seguro.propostas_vistorias_previas
                                  WHERE id = reRecord.id_proposta_vistoria
                                      ;

                                 SELECT COUNT(*)
                                   INTO inCountSemFotos
                                   FROM seguro.propostas_vistorias_previas_historico
                                  WHERE propostas_vistorias_previas_historico.id_proposta_vistoria = reRecord.id_proposta_vistoria
                                    AND propostas_vistorias_previas_historico.id_status            = 71
                                    AND propostas_vistorias_previas_historico.id_usuario_criacao   = 2068
                                    AND propostas_vistorias_previas_historico.ds_motivo            = 'Todos arquivos foto recebidos.'
                                      ;

                                 SELECT MAX(propostas_vistorias_previas_historico.id)
                                   INTO inMaxIdAgendado
                                   FROM seguro.propostas_vistorias_previas_historico
                                  WHERE propostas_vistorias_previas_historico.id_proposta_vistoria = reRecord.id_proposta_vistoria
                                    AND propostas_vistorias_previas_historico.dt_criacao           < dtTransmitidoTablet
                                    AND propostas_vistorias_previas_historico.id_status            = 202
                                      ;

                                 SELECT MIN(propostas_vistorias_previas_historico.id)
                                   INTO inMinIdAnalisando
                                   FROM seguro.propostas_vistorias_previas_historico
                                  WHERE propostas_vistorias_previas_historico.id_proposta_vistoria = reRecord.id_proposta_vistoria
                                    AND propostas_vistorias_previas_historico.dt_criacao           > dtTransmitidoTablet
                                    AND propostas_vistorias_previas_historico.id_status            = 170
                                        --  OR propostas_vistorias_previas_historico.id_status_analise    > 170
                                      ;

                                 IF inMinIdAnalisando IS NULL AND inCountSemFotos > 1 THEN
                                     INSERT
                                       INTO manutencao.corrige_historico_vpd_2308251236
                                     SELECT *
                                       FROM seguro.propostas_vistorias_previas_historico
                                      WHERE propostas_vistorias_previas_historico.id_proposta_vistoria = reRecord.id_proposta_vistoria
                                        AND propostas_vistorias_previas_historico.dt_criacao          != dtTransmitidoTablet
                                        AND propostas_vistorias_previas_historico.id_usuario_criacao   = 2068
                                        AND propostas_vistorias_previas_historico.id                   > inMaxIdAgendado
                                        AND propostas_vistorias_previas_historico.id_status            = 71
                                          ;

                                     DELETE
                                       FROM seguro.propostas_vistorias_previas_historico
                                      WHERE propostas_vistorias_previas_historico.id_proposta_vistoria = reRecord.id_proposta_vistoria
                                        AND propostas_vistorias_previas_historico.dt_criacao          != dtTransmitidoTablet
                                        AND propostas_vistorias_previas_historico.id_usuario_criacao   = 2068
                                        AND propostas_vistorias_previas_historico.id                   > inMaxIdAgendado
                                        AND propostas_vistorias_previas_historico.id_status            = 71
                                          ;
                                 ELSEIF inCountSemFotos > 1 THEN
                                     INSERT
                                       INTO manutencao.corrige_historico_vpd_2308251236
                                     SELECT *
                                       FROM seguro.propostas_vistorias_previas_historico
                                      WHERE propostas_vistorias_previas_historico.id_proposta_vistoria = reRecord.id_proposta_vistoria
                                        AND propostas_vistorias_previas_historico.dt_criacao          != dtTransmitidoTablet
                                        AND propostas_vistorias_previas_historico.id_usuario_criacao   = 2068
                                        AND propostas_vistorias_previas_historico.id                   > inMaxIdAgendado
                                        AND propostas_vistorias_previas_historico.id                   < inMinIdAnalisando
                                        AND propostas_vistorias_previas_historico.id_status            = 71
                                          ;

                                     DELETE
                                       FROM seguro.propostas_vistorias_previas_historico
                                      WHERE propostas_vistorias_previas_historico.id_proposta_vistoria = reRecord.id_proposta_vistoria
                                        AND propostas_vistorias_previas_historico.dt_criacao          != dtTransmitidoTablet
                                        AND propostas_vistorias_previas_historico.id_usuario_criacao   = 2068
                                        AND propostas_vistorias_previas_historico.id                   > inMaxIdAgendado
                                        AND propostas_vistorias_previas_historico.id                   < inMinIdAnalisando
                                        AND propostas_vistorias_previas_historico.id_status            = 71
                                          ;
                                 END IF;

                                 IF inCountSemFotos > 1 THEN
                                     UPDATE seguro.propostas_vistorias_previas_historico
                                        SET id_status = 71
                                      WHERE propostas_vistorias_previas_historico.id_proposta_vistoria = reRecord.id_proposta_vistoria
                                        AND propostas_vistorias_previas_historico.dt_criacao           = dtTransmitidoTablet
                                        AND propostas_vistorias_previas_historico.id_status            = 226
                                          ;

                                     UPDATE seguro.propostas_vistorias_previas_historico
                                        SET id_status = 71
                                      WHERE propostas_vistorias_previas_historico.id_proposta_vistoria = reRecord.id_proposta_vistoria
                                        AND propostas_vistorias_previas_historico.dt_criacao           > dtTransmitidoTablet
                                        AND propostas_vistorias_previas_historico.id_status_analise    > 169
                                        AND propostas_vistorias_previas_historico.id_status            = 226
                                          ;
                                 END IF;
                             END LOOP;
                             CLOSE crCursor;
                         END;
                         $$ LANGUAGE 'plpgsql';
                       ");
        $this->execute("SELECT manutencao.corrige_historico_vpd()");
    }

    public function down(): void
    {
        $this->execute(" INSERT
                           INTO seguro.propostas_vistorias_previas_historico
                         SELECT *
                           FROM manutencao.corrige_historico_vpd_2308251236
                       ");
                $this->execute("
                CREATE OR REPLACE FUNCTION manutencao.desfaz_corrige_historico_vpd() RETURNS VOID AS $$
                DECLARE
                    dtTransmitidoTablet     TIMESTAMP;
                    stSQL                   VARCHAR;
                    crCursor                REFCURSOR;
                    reRecord                RECORD;
                BEGIN
                    stSQL := ' SELECT id_proposta_vistoria
                                 FROM manutencao.corrige_historico_vpd_2308251236
                               GROUP BY id_proposta_vistoria
                             ';

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

                        SELECT propostas_vistorias_previas.dt_transmitido_tablet
                          INTO dtTransmitidoTablet
                          FROM seguro.propostas_vistorias_previas
                         WHERE id = reRecord.id_proposta_vistoria
                             ;

                        UPDATE seguro.propostas_vistorias_previas_historico
                           SET id_status = 226
                         WHERE propostas_vistorias_previas_historico.id_proposta_vistoria = reRecord.id_proposta_vistoria
                           AND propostas_vistorias_previas_historico.dt_criacao           = dtTransmitidoTablet
                           AND propostas_vistorias_previas_historico.id_status            = 71
                             ;
                    END LOOP;
                    CLOSE crCursor;
                END;
                $$ LANGUAGE 'plpgsql';
              ");
        $this->execute("SELECT manutencao.desfaz_corrige_historico_vpd()");
    }
}
