<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class Task2310191114 extends AbstractMigration
{
    public function up(): void
    {
        $this->execute("CREATE OR REPLACE FUNCTION manutencao.atualizar_status ( idPropostaAtualiza     INTEGER
                                                                               , idStatus               INTEGER
                                                                               , idPropostaVigente      INTEGER
                                                                               ) RETURNS                VOID AS $$
                        DECLARE
                        idPropostaAtivar        INTEGER;
                        idPropostaInativar      INTEGER;
                        idAvisoSinistro         INTEGER;
                        idProcesso              INTEGER;
                        stSQL                   VARCHAR;
                        stSQL2                  VARCHAR;
                        reRecord                RECORD;
                        stOperacao              VARCHAR;
                        BEGIN
                        -- CANCELAR/ANULAR
                        --                     (     9    )    (     10    )
                        IF idStatus = 4 OR idStatus = 5 OR idStatus = 13 OR idStatus = 160 OR idStatus = 212 OR idStatus = 213 THEN
                        idPropostaInativar := idPropostaAtualiza;
                        idPropostaAtivar   := idPropostaVigente;
                        stOperacao         := 'inativar';
                        -- ATIVAR
                        ELSEIF idStatus = 3 OR idStatus = 8 OR idStatus = 62 OR idStatus = 102 OR idStatus = 162 THEN
                        idPropostaInativar := idPropostaVigente;
                        idPropostaAtivar   := idPropostaAtualiza;
                        stOperacao         := 'ativar';
                        END IF;

                        stSQL := 'SELECT seguro.ativa_proposta_status('|| idPropostaAtualiza ||','|| idStatus ||');';
                        EXECUTE stSQL;
                        UPDATE seguro.propostas_endosso SET fl_proposta_vigente = FALSE WHERE id_proposta = idPropostaInativar;
                        UPDATE seguro.propostas_endosso SET fl_proposta_vigente = TRUE  WHERE id_proposta = idPropostaAtivar;

                        stSQL2 := '
                        SELECT propostas_vistorias_previas.id
                        FROM seguro.propostas_vistorias_previas
                        JOIN ( SELECT propostas_endosso.id_proposta
                        FROM seguro.propostas_endosso
                        JOIN seguro.propostas_endosso AS endosso_da_proposta
                        ON endosso_da_proposta.id_endosso = propostas_endosso.id_endosso
                        WHERE endosso_da_proposta.id_proposta = '|| idPropostaInativar ||'
                        ) AS interna
                        ON interna.id_proposta = propostas_vistorias_previas.id_proposta
                        WHERE propostas_vistorias_previas.id_status IN (70,66)
                        ;
                        ';
                        FOR reRecord IN EXECUTE stSQL2 LOOP
                        UPDATE seguro.propostas_vistorias_previas SET id_proposta = idPropostaAtivar WHERE id = reRecord.id;

                        --          (     9    )    (     10    )
                        IF  idStatus = 5 OR idStatus = 13 THEN
                        UPDATE seguro.propostas_vistorias_previas SET id_status = 227 WHERE id = reRecord.id;
                        END IF;
                        END LOOP;

                        IF stOperacao = 'inativar' THEN
                        stSQL2 := '
                        SELECT id
                        FROM sinistro.avisos
                        WHERE id_proposta = '|| idPropostaInativar ||'
                        ';
                        FOR reRecord IN EXECUTE stSQL2 LOOP
                        UPDATE sinistro.avisos SET id_proposta = idPropostaAtivar WHERE id_proposta = idPropostaInativar AND id = reRecord.id;
                        END LOOP;

                        stSQL2 := '
                        SELECT id
                        FROM sinistro.avisos_inicio
                        WHERE id_proposta = '|| idPropostaInativar ||'
                        ';
                        FOR reRecord IN EXECUTE stSQL2 LOOP
                        UPDATE sinistro.avisos_inicio SET id_proposta = idPropostaAtivar WHERE id_proposta = idPropostaInativar AND id = reRecord.id;
                        END LOOP;

                        stSQL2 := '
                        SELECT id
                        FROM sinistro.avisos_encerramento
                        WHERE id_proposta = '|| idPropostaInativar ||'
                        ';
                        FOR reRecord IN EXECUTE stSQL2 LOOP
                        UPDATE sinistro.avisos_encerramento SET id_proposta = idPropostaAtivar WHERE id_proposta = idPropostaInativar AND id = reRecord.id;
                        END LOOP;

                        stSQL2 := '
                        SELECT id
                        FROM sinistro.avisos_final_replantio
                        WHERE id_proposta = '|| idPropostaInativar ||'
                        ';
                        FOR reRecord IN EXECUTE stSQL2 LOOP
                        UPDATE sinistro.avisos_final_replantio SET id_proposta = idPropostaAtivar WHERE id_proposta = idPropostaInativar AND id = reRecord.id;
                        END LOOP;

                        stSQL2 := '
                        SELECT id
                        FROM sinistro.processos
                        WHERE id_proposta = '|| idPropostaInativar ||'
                        ';
                        FOR reRecord IN EXECUTE stSQL2 LOOP
                        UPDATE sinistro.processos SET id_proposta = idPropostaAtivar WHERE id_proposta = idPropostaInativar AND id = reRecord.id;
                        END LOOP;

                        -- CASO NAO SEJA A PROPOSTA MAE
                        PERFORM * FROM seguro.propostas WHERE id = idPropostaInativar AND id != propostas.id_proposta_mae;
                        IF FOUND THEN
                        -- CASO SEJA UMA ANULACAO
                        IF idStatus = 213 THEN
                        UPDATE seguro.propostas_status_documento_digitalizado SET fl_ativo = false WHERE id_proposta = idPropostaInativar;
                        INSERT INTO seguro.propostas_status_documento_digitalizado (id_proposta, id_status)
                        VALUES (
                        idPropostaInativar,
                        (SELECT id FROM sistema.status
                        WHERE ds_chave = 'DOC_DISPENSADO'
                        AND id_tipo_status = (SELECT id FROM sistema.tipo_status WHERE ds_chave = 'DOCUMENTO_DIGITALIZADO')
                        )
                        );
                        END IF;
                        END IF;
                        END IF;
                        END;
                        $$ LANGUAGE 'plpgsql';
                     ");

        $row = $this->fetchRow('SELECT id FROM seguro.propostas WHERE id = 893089');
        if ($row['id']) {
            $this->execute("SELECT manutencao.atualizar_status (824437, 13, 893089)");
            $this->execute("SELECT manutencao.atualizar_status (828919, 13, 893089)");
            $this->execute("SELECT manutencao.atualizar_status (893089, 13, 893089)");
        }
    }

    public function down(): void
    {
        $row = $this->fetchRow('SELECT id FROM seguro.propostas WHERE id = 893089');
        if ($row['id']) {
            $this->execute("SELECT manutencao.atualizar_status (828919,  8, 893089)");
            $this->execute("SELECT manutencao.atualizar_status (828919,  8, 893089)");
            $this->execute("SELECT manutencao.atualizar_status (824437,  8, 893089)");
        }
    }
}
