<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class Task2308171641 extends AbstractMigration
{
    public function up(): void
    {
        $this->execute(<<<SQL
           CREATE OR REPLACE FUNCTION seguro.busca_endosso_id(vid_proposta_mae integer, versao_endosso integer) RETURNS integer
                language plpgsql
            as
            $$
                DECLARE
                    contador integer;
                    temprow record;
                BEGIN
                    contador := 0;

                    FOR temprow IN
                        SELECT
                            pr2.id
                        FROM
                            seguro.propostas pr1
                        INNER JOIN seguro.propostas pr2
                            ON pr1.id = pr2.id_proposta_mae
                        INNER JOIN seguro.propostas_endosso pre
                            ON pre.id_proposta = pr2.id
                        INNER JOIN sistema.status
                            ON status.id = pr2.id_status
                        WHERE
                            pr1.id = vid_proposta_mae
                            AND status.ds_chave NOT IN ('ENDOSSO_INCOMPLETO', 'ENDOSSO_ANULADO', 'ORCAMENTO_ENDOSSO', 'SOLICITACAO_CANCELADA')
                        ORDER BY 
                            pr2.id ASC
                    LOOP
                        IF contador = versao_endosso THEN
                            RETURN temprow.id;
                        END IF;

                        contador = contador + 1;
                    END LOOP;

                    RETURN -1;
                END;
            $$;

            CREATE OR REPLACE FUNCTION seguro.nr_endosso(vid_proposta integer, vid_endosso integer) RETURNS DOUBLE PRECISION
                language plpgsql
            as
            $$
            DECLARE
                nr_endosso integer;
            BEGIN
                SELECT count(e.id_endosso) 
                FROM 
                    seguro.propostas_endosso e 
                INNER JOIN seguro.propostas p 
                    ON e.id_proposta = p.id     
                INNER JOIN sistema.status s 
                    ON p.id_status = s.id 
                INTO
                    nr_endosso
                WHERE 
                    e.id_proposta < vid_proposta
                    AND e.id_endosso = vid_endosso
                    AND s.ds_chave NOT IN ('ENDOSSO_INCOMPLETO', 'ENDOSSO_ANULADO', 'ORCAMENTO_ENDOSSO', 'SOLICITACAO_CANCELADA');

                IF nr_endosso > 0 THEN
                    return nr_endosso;
                END IF;
                
                RETURN 0;
            END;
            $$;
SQL
);
    }

    public function down(): void
    {
        $this->execute(<<<SQL
            DROP FUNCTION seguro.busca_endosso_id;
SQL
);
    }
}
