<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class Task2107021603 extends AbstractMigration
{
    public function up(): void
    {
        $this->upDDL();
        $this->upPL();
    }

    public function down(): void
    {
        $this->downPL();
        $this->downDDL();
    }

    private function downDDL()
    {
        $this->execute(<<<SQL
UPDATE seguro.endosso_tipo_solicitacao SET fl_ativo = true;

DELETE FROM seguro.endosso_tipo_solicitacao WHERE ds_chave IN ('CANCELAMENTO_APOLICE', 'COM_MOVIMENTO_PREMIO', 'SEM_MOVIMENTO_PREMIO');

UPDATE sistema.status SET fl_ativo = false WHERE id_tipo_status = 1 AND ds_chave = 'SOLICITACAO_ENDOSSO';
UPDATE sistema.status SET fl_ativo = false WHERE id_tipo_status = 1 AND ds_chave = 'SOLICITACAO_CANCELADA';
UPDATE sistema.status SET fl_ativo = false WHERE id_tipo_status = 17 AND ds_chave = 'CANCELADO';

ALTER TABLE seguro.propostas_endosso_solicitacao DROP COLUMN nr_parcelas;
ALTER TABLE seguro.propostas_endosso_solicitacao DROP COLUMN fl_ocorreu_sinistro;
ALTER TABLE seguro.propostas_endosso_solicitacao DROP COLUMN ds_campos_alteracoes;
ALTER TABLE seguro.propostas_endosso_solicitacao DROP COLUMN ds_campos_valores_iniciais;

UPDATE sistema.status SET ds_status = 'Aguardando Formulário Assinado', ds_chave = 'SOLICITACAO_ENDOSSO_AGUARDANDO_FORM_ASS' where id = 237;
SQL
        );
    }

    private function downPL()
    {
        $this->execute(<<<SQL
CREATE OR REPLACE FUNCTION seguro.verifica_status_proposta()
  RETURNS trigger
  LANGUAGE plpgsql
  AS \$function\$
DECLARE
  idStatus integer;
BEGIN
  SELECT id_status INTO idStatus FROM seguro.propostas WHERE id = NEW.id_proposta;
  
  IF idStatus not in (4,160,162,163,59,2,13) THEN
          RAISE EXCEPTION 'Status inválido para esta operação (%)', idStatus;
  END IF;
  
  RETURN new;
END;
\$function\$
SQL
        );
    }

    private function upDDL()
    {
        $this->execute(<<<SQL
UPDATE seguro.endosso_tipo_solicitacao SET fl_ativo = false;

INSERT INTO seguro.endosso_tipo_solicitacao (ds_tipo_endosso, ds_orientacao, ds_chave) VALUES ('Cancelamento de Apólice', 'Cancelamento de Apólice', 'CANCELAMENTO_APOLICE');
INSERT INTO seguro.endosso_tipo_solicitacao (ds_tipo_endosso, ds_orientacao, ds_chave) VALUES ('Alteração de Apólice - Com Movimento de Prêmio/LMGA', 'Alteração de Apólice - Com Movimento de Prêmio/LMGA', 'COM_MOVIMENTO_PREMIO');
INSERT INTO seguro.endosso_tipo_solicitacao (ds_tipo_endosso, ds_orientacao, ds_chave) VALUES ('Alteração de Apólice - Sem Movimento de Prêmio/LMGA', 'Alteração de Apólice - Sem Movimento de Prêmio/LMGA', 'SEM_MOVIMENTO_PREMIO');

UPDATE sistema.status SET fl_ativo = true WHERE id_tipo_status = 1 AND ds_chave = 'SOLICITACAO_ENDOSSO';
UPDATE sistema.status SET fl_ativo = true WHERE id_tipo_status = 1 AND ds_chave = 'SOLICITACAO_CANCELADA';
UPDATE sistema.status SET fl_ativo = true WHERE id_tipo_status = 17 AND ds_chave = 'CANCELADO';

ALTER TABLE seguro.propostas_endosso_solicitacao ADD COLUMN nr_parcelas INTEGER;
ALTER TABLE seguro.propostas_endosso_solicitacao ADD COLUMN fl_ocorreu_sinistro BOOLEAN DEFAULT NULL;
ALTER TABLE seguro.propostas_endosso_solicitacao ADD COLUMN ds_campos_alteracoes jsonb;
ALTER TABLE seguro.propostas_endosso_solicitacao ADD COLUMN ds_campos_valores_iniciais jsonb;

UPDATE sistema.status SET ds_status = 'Solicitação Não Finalizada' where id = 237;
SQL
        );
    }

    private function upPL()
    {
        $this->execute(<<<SQL
CREATE OR REPLACE FUNCTION seguro.verifica_status_proposta()
  RETURNS trigger
  LANGUAGE plpgsql
  AS \$function\$
DECLARE
  idStatus integer;
BEGIN
  SELECT id_status INTO idStatus FROM seguro.propostas WHERE id = NEW.id_proposta;
  
  IF idStatus not in (4,160,162,163,59,2,13,269) THEN
          RAISE EXCEPTION 'Status inválido para esta operação (%)', idStatus;
  END IF;
  
  RETURN new;
END;
\$function\$
SQL
        );
    }
}
