<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class Task2107211609 extends AbstractMigration
{
    public function up(): void
    {
        $delete = $this->getQueryBuilder();
        $delete->delete('manutencao.ajusta_dispensas')
               ->execute();

        $table = $this->table('manutencao.ajusta_dispensas');
        $rows = [
                   ['id_proposta' => 489641, 'in_tipo' => 2],
                   ['id_proposta' => 478498, 'in_tipo' => 2],
                   ['id_proposta' => 481674, 'in_tipo' => 2],
                   ['id_proposta' => 481683, 'in_tipo' => 2],
                   ['id_proposta' => 483981, 'in_tipo' => 5],//'in_tipo' => 2],
                   ['id_proposta' => 484376, 'in_tipo' => 2],
                   ['id_proposta' => 484977, 'in_tipo' => 2],
                   ['id_proposta' => 485624, 'in_tipo' => 2],
                   ['id_proposta' => 485707, 'in_tipo' => 2],
                   ['id_proposta' => 485936, 'in_tipo' => 2],
                   ['id_proposta' => 485944, 'in_tipo' => 2],
                   ['id_proposta' => 486124, 'in_tipo' => 2],
                   ['id_proposta' => 486599, 'in_tipo' => 2],
                   ['id_proposta' => 486892, 'in_tipo' => 2],
                   ['id_proposta' => 486895, 'in_tipo' => 2],
                   ['id_proposta' => 486994, 'in_tipo' => 2],
                   ['id_proposta' => 487208, 'in_tipo' => 2],
                   ['id_proposta' => 487220, 'in_tipo' => 2],
                   ['id_proposta' => 484325, 'in_tipo' => 3],
                   ['id_proposta' => 482898, 'in_tipo' => 5],
                   ['id_proposta' => 482903, 'in_tipo' => 5],
                   ['id_proposta' => 482954, 'in_tipo' => 5],
                   ['id_proposta' => 484920, 'in_tipo' => 5],
                   ['id_proposta' => 488328, 'in_tipo' => 5]
        ];
        $table->insert($rows)
              ->save();

        $this->execute("CREATE OR REPLACE FUNCTION manutencao.ajusta_dispensas() RETURNS VOID AS $$
                        DECLARE
                            stSQL                       VARCHAR;
                            reRecord                    RECORD;
                            id_aviso_meio               INTEGER;
                            inTesteStatusAgendamento    INTEGER;
                        BEGIN
                            stSQL := '
                                        SELECT ajusta_dispensas.id_proposta
                                              , ajusta_dispensas.in_tipo
                                              , propostas.id                           AS id_endosso
                                              , processos.id                           AS id_processo
                                              , MIN(avisos.id)                         AS id_aviso_first
                                              , MAX(avisos.id)                         AS id_aviso_last
                                              , vistoria_preliminar.id_vistoria        AS id_vistoria_preliminar
                                              , agendamento_preliminar.id_agendamento  AS id_agendamento_preliminar
                                              , MIN(laudos_preliminares.id)            AS id_laudo_preliminar
                                              , vistoria_final.id_vistoria             AS id_vistoria_final
                                              , agendamento_final.id_agendamento       AS id_agendamento_final
                                              , vistoria_dispensada.id_vistoria        AS id_vistoria_dispensada
                                              , agendamento_dispensada.id_agendamento  AS id_agendamento_dispensada
                                              , MAX(laudos_preliminares.id)            AS id_laudo_dispensada

                                           FROM manutencao.ajusta_dispensas

                                           JOIN seguro.propostas
                                             ON propostas.id_proposta_mae = ajusta_dispensas.id_proposta
                                           JOIN sinistro.avisos
                                             ON avisos.id_proposta = propostas.id
                                           JOIN sinistro.processos
                                             ON processos.id_proposta = propostas.id
                                           JOIN (
                                                    SELECT MIN(vistorias_processos.id_vistoria) AS id_vistoria
                                                         , vistorias_processos.id_processo
                                                      FROM sinistro.vistorias_processos
                                                      JOIN sistema.vistorias
                                                        ON vistorias.id = vistorias_processos.id_vistoria
                                                       AND vistorias.id_tipo = 2 
                                                  GROUP BY vistorias_processos.id_processo
                                                ) AS vistoria_preliminar
                                             ON vistoria_preliminar.id_processo = processos.id
                                           JOIN (
                                                    SELECT MAX(vistorias_processos.id_vistoria) AS id_vistoria
                                                         , vistorias_processos.id_processo
                                                      FROM sinistro.vistorias_processos
                                                      JOIN sistema.vistorias
                                                        ON vistorias.id = vistorias_processos.id_vistoria
                                                       AND vistorias.id_tipo = 2 
                                                  GROUP BY vistorias_processos.id_processo
                                                ) AS vistoria_dispensada
                                             ON vistoria_dispensada.id_processo = processos.id
                                           JOIN (
                                                    SELECT MIN(vistorias_processos.id_vistoria) AS id_vistoria
                                                         , vistorias_processos.id_processo
                                                      FROM sinistro.vistorias_processos
                                                      JOIN sistema.vistorias
                                                        ON vistorias.id = vistorias_processos.id_vistoria
                                                       AND vistorias.id_tipo = 3 
                                                  GROUP BY vistorias_processos.id_processo
                                                ) AS vistoria_final
                                             ON vistoria_final.id_processo = processos.id
                                           JOIN sinistro.laudos_preliminares
                                             ON laudos_preliminares.id_processo = processos.id
                                           JOIN sistema.vistorias_agendamentos AS agendamento_preliminar
                                             ON agendamento_preliminar.id_vistoria = vistoria_preliminar.id_vistoria
                                           JOIN sistema.vistorias_agendamentos AS agendamento_final
                                             ON agendamento_final.id_vistoria = vistoria_final.id_vistoria
                                           JOIN sistema.vistorias_agendamentos AS agendamento_dispensada
                                             ON agendamento_dispensada.id_vistoria = vistoria_dispensada.id_vistoria
                                        
                                       GROUP BY ajusta_dispensas.id_proposta
                                              , ajusta_dispensas.in_tipo
                                              , propostas.id
                                              , processos.id
                                              , vistoria_preliminar.id_vistoria
                                              , agendamento_preliminar.id_agendamento
                                              , vistoria_final.id_vistoria
                                              , agendamento_final.id_agendamento
                                              , vistoria_dispensada.id_vistoria
                                              , agendamento_dispensada.id_agendamento
                                       ORDER BY ajusta_dispensas.in_tipo
                                           ;
                                           ;
                                     ';
                            FOR reRecord IN EXECUTE stSQL LOOP
                                IF reRecord.in_tipo = 1 THEN
                                        
                                    UPDATE sistema.agendamentos
                                       SET id_status = 202
                                     WHERE id = reRecord.id_agendamento_preliminar
                                       AND id_status = 203
                                       AND id_tipo_vistoria = 2
                                         ;
                                        
                                    UPDATE sistema.agendamentos
                                       SET id_status = 203
                                     WHERE id = reRecord.id_agendamento_dispensada
                                       AND (id_status = 202 OR id_status = 201)
                                       AND id_tipo_vistoria = 2
                                         ;
                                        
                                    UPDATE sistema.agendamentos
                                       SET id_status = 201
                                     WHERE id = reRecord.id_agendamento_final
                                       AND (id_status = 202 OR id_status = 203)
                                       AND id_tipo_vistoria = 3
                                         ;
                                        
                                    UPDATE sinistro.laudos_preliminares
                                       SET id_status = 210
                                     WHERE id_processo = reRecord.id_processo
                                       AND id = reRecord.id_laudo_preliminar
                                         ;
                                        
                                    IF NOT EXISTS (SELECT 1 FROM sinistro.vistorias_avisos WHERE id_vistoria = reRecord.id_vistoria_preliminar AND id_aviso = reRecord.id_aviso_first) THEN
                                        INSERT
                                          INTO sinistro.vistorias_avisos
                                             ( id_usuario_criacao
                                             , dt_criacao
                                             , id_vistoria
                                             , id_aviso
                                             )
                                        VALUES
                                             ( 2530
                                             , NOW()
                                             , reRecord.id_vistoria_preliminar
                                             , reRecord.id_aviso_first
                                             );
                                    END IF;
                                ELSIF reRecord.in_tipo = 2 THEN
                                         
                                    UPDATE sistema.agendamentos
                                       SET id_status = 202 -- AGENDADO
                                     WHERE id = reRecord.id_agendamento_preliminar
                                       AND id_status = 203 -- CANCELADO
                                       AND id_tipo_vistoria = 2
                                         ;
                                         
                                    UPDATE sistema.agendamentos
                                       SET id_status = 203 -- CANCELADO
                                     WHERE id = reRecord.id_agendamento_dispensada
                                       AND (id_status = 202 OR id_status = 201) -- AGENDADO ou AGUARDANDO AGENDAMENTO
                                       AND id_tipo_vistoria = 2
                                         ;

                                    IF (reRecord.id_laudo_preliminar != reRecord.id_laudo_dispensada) THEN
                                        DELETE
                                          FROM sinistro.vistorias_avisos
                                         WHERE (    id_aviso = reRecord.id_aviso_first
                                                 OR id_aviso = reRecord.id_aviso_last
                                               )
                                           AND id_vistoria = reRecord.id_vistoria_dispensada
                                             ;
                                        IF (reRecord.in_tipo != 4) THEN
                                            UPDATE sinistro.laudos_preliminares
                                               SET id_status = 206
                                             WHERE id_processo = reRecord.id_processo
                                               AND id = reRecord.id_laudo_dispensada
                                                 ;
                                        END IF;
                                    END IF;
                                         
                                    UPDATE sinistro.laudos_preliminares
                                       SET id_status = 76
                                         , fl_assinatura_regulador   = TRUE
                                         , fl_assinatura_segurado    = TRUE
                                         , fl_evento_nao_constatado  = FALSE
                                         , fl_transmitido_seguradora = TRUE
                                         , fl_area_atingida          = 'T'
                                         , fl_dt_evento_em_cobertura = TRUE
                                         , ds_coordenadas = (SELECT ds_coordenadas FROM seguro.propostas_propriedades WHERE id_proposta = reRecord.id_proposta)
                                     WHERE id_processo = reRecord.id_processo
                                       AND id = reRecord.id_laudo_preliminar
                                       AND id_status != 76;
                                         
                                    UPDATE sinistro.laudos_preliminares_itens_segurados
                                       SET fl_quadra_sinistrada = TRUE
                                     WHERE id_laudo_preliminar  = reRecord.id_laudo_preliminar
                                       AND id_laudo_preliminar  = 35168
                                       AND fl_quadra_sinistrada = FALSE;
                                         
                                    IF EXISTS ( SELECT 1 FROM regulacao.lp001 WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar) THEN
                                        UPDATE regulacao.lp001 SET fl_areas_declaradas_conferem = TRUE WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar;
                                    ELSIF EXISTS ( SELECT 1 FROM regulacao.lp002 WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar) THEN
                                        UPDATE regulacao.lp002 SET fl_areas_declaradas_conferem = TRUE WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar;
                                    ELSIF EXISTS ( SELECT 1 FROM regulacao.lp003 WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar) THEN
                                        UPDATE regulacao.lp003 SET fl_areas_declaradas_conferem = TRUE WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar;
                                    ELSIF EXISTS ( SELECT 1 FROM regulacao.lp004 WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar) THEN
                                        UPDATE regulacao.lp004 SET fl_areas_declaradas_conferem = TRUE WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar;
                                    END IF;
                                         
                                    IF NOT EXISTS (SELECT 1 FROM sinistro.vistorias_avisos WHERE id_vistoria = reRecord.id_vistoria_preliminar AND id_aviso = reRecord.id_aviso_first) THEN
                                        INSERT
                                          INTO sinistro.vistorias_avisos
                                             ( id_usuario_criacao
                                             , dt_criacao
                                             , id_vistoria
                                             , id_aviso
                                             )
                                        VALUES
                                             ( 2530
                                             , NOW()
                                             , reRecord.id_vistoria_preliminar
                                             , reRecord.id_aviso_first
                                             );
                                    END IF;
                                ELSIF reRecord.in_tipo = 3 THEN
                                    RAISE NOTICE 'tipo %', reRecord.in_tipo;
                                    
                                    UPDATE sistema.agendamentos
                                       SET id_status = 202 -- AGENDADO
                                     WHERE id = reRecord.id_agendamento_preliminar
                                       AND id_status = 203 -- CANCELADO
                                       AND id_tipo_vistoria = 2
                                         ;
                                    
                                    UPDATE sistema.agendamentos
                                       SET id_status = 203 -- CANCELADO
                                     WHERE id = reRecord.id_agendamento_dispensada
                                       AND (id_status = 202 OR id_status = 201) -- AGENDADO ou AGUARDANDO AGENDAMENTO
                                       AND id_tipo_vistoria = 2
                                         ;

                                    IF (reRecord.id_laudo_preliminar != reRecord.id_laudo_dispensada) THEN
                                        DELETE
                                          FROM sinistro.vistorias_avisos
                                         WHERE (    id_aviso = reRecord.id_aviso_first
                                                 OR id_aviso = reRecord.id_aviso_last
                                               )
                                           AND id_vistoria = reRecord.id_vistoria_dispensada
                                             ;
                                        IF (reRecord.in_tipo != 4) THEN
                                            UPDATE sinistro.laudos_preliminares
                                               SET id_status = 206
                                             WHERE id_processo = reRecord.id_processo
                                               AND id = reRecord.id_laudo_dispensada
                                                 ;
                                        END IF;
                                    END IF;
                                    
                                    UPDATE sinistro.laudos_preliminares
                                       SET id_status = 76
                                         , fl_assinatura_regulador   = TRUE
                                         , fl_assinatura_segurado    = TRUE
                                         , fl_evento_nao_constatado  = FALSE
                                         , fl_transmitido_seguradora = TRUE
                                         , fl_area_atingida          = 'T'
                                         , fl_dt_evento_em_cobertura = TRUE
                                         , ds_coordenadas = (SELECT ds_coordenadas FROM seguro.propostas_propriedades WHERE id_proposta = reRecord.id_proposta)
                                     WHERE id_processo = reRecord.id_processo
                                       AND id          = reRecord.id_laudo_preliminar
                                       AND id_status  != 76;
                                    
                                    IF EXISTS ( SELECT 1 FROM regulacao.lp001 WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar) THEN
                                        UPDATE regulacao.lp001 SET fl_areas_declaradas_conferem = TRUE WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar;
                                    ELSIF EXISTS ( SELECT 1 FROM regulacao.lp002 WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar) THEN
                                        UPDATE regulacao.lp002 SET fl_areas_declaradas_conferem = TRUE WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar;
                                    ELSIF EXISTS ( SELECT 1 FROM regulacao.lp003 WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar) THEN
                                        UPDATE regulacao.lp003 SET fl_areas_declaradas_conferem = TRUE WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar;
                                    ELSIF EXISTS ( SELECT 1 FROM regulacao.lp004 WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar) THEN
                                        UPDATE regulacao.lp004 SET fl_areas_declaradas_conferem = TRUE WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar;
                                    END IF;
                                    
                                    IF NOT EXISTS (SELECT 1 FROM sinistro.vistorias_avisos WHERE id_vistoria = reRecord.id_vistoria_preliminar AND id_aviso = reRecord.id_aviso_first) THEN
                                        INSERT
                                          INTO sinistro.vistorias_avisos
                                             ( id_usuario_criacao
                                             , dt_criacao
                                             , id_vistoria
                                             , id_aviso
                                             )
                                        VALUES
                                             ( 2530
                                             , NOW()
                                             , reRecord.id_vistoria_preliminar
                                             , reRecord.id_aviso_first
                                             );
                                    END IF;
                                         
                                    SELECT id
                                      INTO id_aviso_meio
                                      FROM sinistro.avisos
                                     WHERE id_proposta = reRecord.id_endosso
                                       AND id NOT IN (reRecord.id_aviso_first,reRecord.id_aviso_last);
                                         
                                    IF NOT EXISTS (SELECT 1 FROM sinistro.vistorias_avisos WHERE id_vistoria = reRecord.id_vistoria_preliminar AND id_aviso = id_aviso_meio) THEN
                                        INSERT
                                          INTO sinistro.vistorias_avisos
                                             ( id_usuario_criacao
                                             , dt_criacao
                                             , id_vistoria
                                             , id_aviso
                                             )
                                        VALUES
                                             ( 2530
                                             , NOW()
                                             , reRecord.id_vistoria_preliminar
                                             , id_aviso_meio
                                             );
                                    END IF;
                                ELSIF reRecord.in_tipo = 5 THEN
                                    UPDATE sistema.agendamentos
                                       SET id_status = 202 -- AGENDADO
                                     WHERE id = reRecord.id_agendamento_preliminar
                                       AND id_status = 203 -- CANCELADO
                                       AND id_tipo_vistoria = 2
                                         ;

                                    SELECT id_status
                                      INTO inTesteStatusAgendamento
                                      FROM sistema.agendamentos
                                     WHERE id = reRecord.id_agendamento_dispensada
                                         ;

                                    IF inTesteStatusAgendamento = 203 AND EXISTS (SELECT id FROM sinistro.laudos_preliminares WHERE id = reRecord.id_laudo_dispensada) THEN
                                        UPDATE sistema.agendamentos
                                           SET id_status = 201 -- AGUARDANDO AGENDAMENTO
                                         WHERE id = reRecord.id_agendamento_dispensada
                                           AND id_status = 203 -- CANCELADO
                                           AND id_tipo_vistoria = 2
                                             ;
                                    ELSIF NOT EXISTS (SELECT id FROM sinistro.laudos_preliminares WHERE id = reRecord.id_laudo_dispensada) THEN
                                        UPDATE sistema.agendamentos
                                           SET id_status = 203 -- CANCELADO
                                         WHERE id = reRecord.id_agendamento_dispensada
                                           AND (id_status = 202 OR id_status = 201) -- AGENDADO ou AGUARDANDO AGENDAMENTO
                                           AND id_tipo_vistoria = 2
                                             ;
                                    END IF;
                                         
                                    IF (reRecord.id_laudo_preliminar != reRecord.id_laudo_dispensada) THEN
                                        DELETE
                                          FROM sinistro.vistorias_avisos
                                         WHERE (    id_aviso = reRecord.id_aviso_first
                                              -- OR id_aviso = reRecord.id_aviso_last
                                               )
                                           AND id_vistoria = reRecord.id_vistoria_dispensada
                                             ;
                                    END IF;
                                         
                                    UPDATE sinistro.laudos_preliminares
                                       SET id_status = 76
                                         , fl_assinatura_regulador   = TRUE
                                         , fl_assinatura_segurado    = TRUE
                                         , fl_evento_nao_constatado  = FALSE
                                         , fl_transmitido_seguradora = TRUE
                                         , fl_area_atingida          = 'T'
                                         , fl_dt_evento_em_cobertura = TRUE
                                         , ds_coordenadas = (SELECT ds_coordenadas FROM seguro.propostas_propriedades WHERE id_proposta = reRecord.id_proposta)
                                     WHERE id_processo = reRecord.id_processo
                                       AND id = reRecord.id_laudo_preliminar;
                                         
                                    IF EXISTS ( SELECT 1 FROM regulacao.lp001 WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar) THEN
                                        UPDATE regulacao.lp001 SET fl_areas_declaradas_conferem = TRUE WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar;
                                    ELSIF EXISTS ( SELECT 1 FROM regulacao.lp002 WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar) THEN
                                        UPDATE regulacao.lp002 SET fl_areas_declaradas_conferem = TRUE WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar;
                                    ELSIF EXISTS ( SELECT 1 FROM regulacao.lp003 WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar) THEN
                                        UPDATE regulacao.lp003 SET fl_areas_declaradas_conferem = TRUE WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar;
                                    ELSIF EXISTS ( SELECT 1 FROM regulacao.lp004 WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar) THEN
                                        UPDATE regulacao.lp004 SET fl_areas_declaradas_conferem = TRUE WHERE id_laudo_preliminar = reRecord.id_laudo_preliminar;
                                    END IF;
                                         
                                    IF NOT EXISTS (SELECT 1 FROM sinistro.vistorias_avisos WHERE id_vistoria = reRecord.id_vistoria_preliminar AND id_aviso = reRecord.id_aviso_first) THEN
                                        INSERT
                                          INTO sinistro.vistorias_avisos
                                             ( id_usuario_criacao
                                             , dt_criacao
                                             , id_vistoria
                                             , id_aviso
                                             )
                                        VALUES
                                             ( 2530
                                             , NOW()
                                             , reRecord.id_vistoria_preliminar
                                             , reRecord.id_aviso_first
                                             );
                                    END IF;
                                END IF;
                            END LOOP;
                        END;
                        $$ LANGUAGE 'plpgsql';
                      ");

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

    public function down(): void
    {

    }
}
