<?php

declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class TaskInc61614 extends AbstractMigration
{
    public function up(): void
    {
        $this->execute(<<<SQL
            -- Tabela temporária para realizar rollback caso necessário
            CREATE TABLE sinistro.vistoriador_despesa_backup AS
            SELECT 
                vistoriador_despesa.id,
                vistoriador_despesa.id_proposta
            FROM sinistro.vistoriador_despesa 
            INNER JOIN seguro.propostas_endosso endosso1
                ON endosso1.id_proposta = vistoriador_despesa.id_proposta
            INNER JOIN seguro.propostas_endosso endosso2
                ON endosso2.id_endosso = endosso1.id_endosso
                    AND endosso2.fl_proposta_vigente IS TRUE
            WHERE id_vistoria IS NULL
                AND endosso1.fl_proposta_vigente IS FALSE;

            -- Atualiza vínculo da despesa para proposta vigente
            UPDATE sinistro.vistoriador_despesa
            SET id_proposta = endosso2.id_proposta
            FROM seguro.propostas_endosso endosso1
            INNER JOIN seguro.propostas_endosso endosso2
                ON endosso2.id_endosso = endosso1.id_endosso
                    AND endosso2.fl_proposta_vigente IS TRUE
            WHERE id_vistoria IS NULL
                AND endosso1.id_proposta = vistoriador_despesa.id_proposta
                AND endosso1.fl_proposta_vigente IS FALSE;

            -- Tabela temporária para realizar rollback caso necessário
            CREATE TABLE seguro.propostas_vistorias_previas_backup AS
            SELECT propostas_vistorias_previas.id, propostas_vistorias_previas.id_proposta, propostas_vistorias_previas.id_vistoria
            FROM seguro.propostas_endosso endosso_nao_vigente
            INNER JOIN seguro.propostas_vistorias_previas
                ON propostas_vistorias_previas.id_proposta = endosso_nao_vigente.id_proposta
            INNER JOIN seguro.propostas_endosso endosso_vigente
                ON  endosso_vigente.id_endosso = endosso_nao_vigente.id_endosso 
                    AND endosso_vigente.fl_proposta_vigente IS TRUE
            WHERE
                propostas_vistorias_previas.id_vistoria IS NOT NULL
                AND endosso_nao_vigente.fl_proposta_vigente IS FALSE;
            
            -- Atualiza vínculo da vistoria prévia sem cobrança para a proposta vigente
            UPDATE seguro.propostas_vistorias_previas
            SET id_proposta = endosso_vigente.id_proposta
            FROM seguro.propostas_endosso endosso_nao_vigente
            INNER JOIN seguro.propostas_endosso endosso_vigente
                ON  endosso_vigente.id_endosso = endosso_nao_vigente.id_endosso 
                    AND endosso_vigente.fl_proposta_vigente IS TRUE
            WHERE
                propostas_vistorias_previas.id_proposta = endosso_nao_vigente.id_proposta
                AND propostas_vistorias_previas.id_vistoria IS NOT NULL
                AND endosso_nao_vigente.fl_proposta_vigente IS FALSE;
SQL    
        );
    }

    public function down(): void
    {
        $this->execute(<<<SQL
            UPDATE sinistro.vistoriador_despesa
            SET id_proposta = vistoriador_despesa_backup.id_proposta
            FROM sinistro.vistoriador_despesa_backup
            WHERE vistoriador_despesa_backup.id = vistoriador_despesa.id;

            UPDATE seguro.propostas_vistorias_previas
            SET id_proposta = propostas_vistorias_previas_backup.id_proposta
            FROM seguro.propostas_vistorias_previas_backup
            WHERE propostas_vistorias_previas.id = propostas_vistorias_previas_backup.id;

            DROP TABLE seguro.propostas_vistorias_previas_backup;
            DROP TABLE sinistro.vistoriador_despesa_backup;
SQL    
        );
    }
}
