<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class Task2205201656 extends AbstractMigration
{
    public function up(): void
    {
        $this->execute(<<<SQL
ALTER TABLE seguro.beneficiarios_arquivos ADD COLUMN fl_arquivo_reaproveitado BOOL default false;

CREATE table log.log_beneficiarios_arquivos_status (
    id SERIAL,
    id_beneficiario INTEGER NOT NULL,
    id_status INTEGER NOT NULL,
    CONSTRAINT pk_log_beneficiarios_arquivos_status PRIMARY KEY (id),
    CONSTRAINT fk_log_beneficiarios_arquivos_status_beneficiario FOREIGN KEY (id_beneficiario) REFERENCES seguro.beneficiarios (id),
    CONSTRAINT fk_log_beneficiarios_arquivos_status_status FOREIGN KEY (id_status) REFERENCES sistema.status (id)
) INHERITS (public.campos_default);

CREATE TABLE seguro.informacoes_bancarias_beneficiarios (
  id SERIAL NOT NULL,
  id_informacoes_bancarias INTEGER NOT NULL,
  id_beneficiario INTEGER NOT NULL,
  id_forma_pagamento INTEGER NOT NULL,
  CONSTRAINT pk_informacoes_bancarias_beneficiario PRIMARY KEY (id),
  CONSTRAINT fk_pk_informacoes_bancarias_beneficiario_informacoes_bancarias FOREIGN KEY (id_informacoes_bancarias) REFERENCES sistema.informacoes_bancarias (id),
  CONSTRAINT fk_pk_informacoes_bancarias_beneficiario_beneficiario FOREIGN KEY (id_beneficiario) REFERENCES seguro.beneficiarios (id),
  CONSTRAINT fk_pk_informacoes_bancarias_beneficiario_forma_pagamento FOREIGN KEY (id_forma_pagamento) REFERENCES sistema.formas_pagamento (id)
) INHERITS (public.campos_default);

CREATE table log.log_alteracoes_informacoes_bancarias_beneficiarios (
    id SERIAL,
    id_informacoes_bancarias_beneficiarios INTEGER NOT NULL,
    ds_informacoes_bancarias jsonb,
    CONSTRAINT pk_log_alteracoes_informacoes_bancarias_beneficiarios PRIMARY KEY (id),
    CONSTRAINT fk_log_alteracoes_informacoes_bancarias_beneficiarios FOREIGN KEY (id_informacoes_bancarias_beneficiarios) REFERENCES seguro.informacoes_bancarias_beneficiarios (id)
) INHERITS (public.campos_default);

CREATE OR REPLACE FUNCTION seguro.migracao_informacoes_bancarias()
          RETURNS void AS $$

DECLARE
  sql varchar;
  sql2 varchar;
  registro record;
  registro2 record;
  retorno record;

BEGIN
  sql := 'SELECT distinct cpf_cnpj, id_proposta, id_banco, nu_conta_corrente, nu_digito_conta_corrente, nu_agencia, nu_digito_agencia, id_forma_pagamento
            FROM seguro.informacoes_bancarias ib';

  FOR registro IN EXECUTE sql LOOP
    -- RAISE NOTICE '>>>>> INICIANDO CPF/CNPJ: %', registro.cpf_cnpj;
    sql2 := 'SELECT distinct pb.id_proposta 
               FROM seguro.propostas_beneficiarios pb
                    LEFT JOIN seguro.informacoes_bancarias ib ON ib.cpf_cnpj = pb.nr_cpf_cnpj AND ib.id_proposta = pb.id_proposta
              WHERE pb.nr_cpf_cnpj = ' || quote_literal(registro.cpf_cnpj) || ' 
                AND ib.id IS NULL
              ORDER BY 1 desc';

    FOR registro2 IN EXECUTE sql2 LOOP
        -- RAISE NOTICE 'cpf_cnpj: % - id_proposta: %', registro.cpf_cnpj, registro2.id_proposta;
        INSERT INTO seguro.informacoes_bancarias (id_usuario_criacao, dt_criacao, id_proposta, cpf_cnpj, id_banco, nu_conta_corrente, nu_digito_conta_corrente, nu_agencia, nu_digito_agencia, id_forma_pagamento)
             VALUES (3379, now(), registro2.id_proposta, registro.cpf_cnpj, registro.id_banco, registro.nu_conta_corrente, registro.nu_digito_conta_corrente, registro.nu_agencia, registro.nu_digito_agencia, registro.id_forma_pagamento);
      END LOOP;
  END LOOP;
END;
$$ LANGUAGE 'plpgsql';

select seguro.migracao_informacoes_bancarias();
SQL
);
    }

    public function down(): void
    {
        $this->execute(<<<SQL
ALTER TABLE seguro.beneficiarios_arquivos DROP COLUMN fl_arquivo_reaproveitado;

DROP TABLE log.log_beneficiarios_arquivos_status;
DROP TABLE log.log_alteracoes_informacoes_bancarias_beneficiarios;
DROP TABLE seguro.informacoes_bancarias_beneficiarios;

DROP FUNCTION seguro.migracao_informacoes_bancarias;
SQL
);
    }
}
