<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

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

create temp table tmp_beneficiarios_cooperativa_max as (select max(sba_max.id) as id, id_beneficiario
                                                        from seguro.beneficiarios_arquivos sba_max
                                                                 inner join seguro.beneficiarios sb_max on sb_max.id = sba_max.id_beneficiario
                                                        where id_tipo_arquivo in (8, 3, 11, 9, 6)
                                                          and sb_max.id_tipo_beneficiario = 1
                                                          and to_char(sba_max.dt_criacao, 'yyyy')::int >= 2022
                                                        group by id_tipo_arquivo, id_beneficiario
                                                        order by id_beneficiario);

create temp table tmp_beneficiarios_cooperativa as (select min_id.id,
                                                           sba.id_beneficiario,
                                                           to_char(dt_criacao, 'yyyy-MM-dd')::date as data_criacao
                                                    from (select min(id) as id, id_beneficiario
                                                          from tmp_beneficiarios_cooperativa_max as max_id
                                                          group by id_beneficiario) as min_id
                                                             inner join seguro.beneficiarios_arquivos sba on sba.id = min_id.id);

update seguro.beneficiarios_arquivos
   set fl_vigencia_atual = 't'
  from tmp_beneficiarios_cooperativa_max
 where tmp_beneficiarios_cooperativa_max.id = seguro.beneficiarios_arquivos.id;

update seguro.beneficiarios
set dt_arquivo_antigo_vigencia_atual = data_criacao
from tmp_beneficiarios_cooperativa
where tmp_beneficiarios_cooperativa.id_beneficiario = seguro.beneficiarios.id;

create temp table tmp_beneficiarios_ltda_max as (select max(sba_max.id) as id, id_beneficiario
                                                 from seguro.beneficiarios_arquivos sba_max
                                                          inner join seguro.beneficiarios sb_max on sb_max.id = sba_max.id_beneficiario
                                                 where id_tipo_arquivo in (8, 3, 7, 11)
                                                   and sb_max.id_tipo_beneficiario = 2
                                                   and to_char(sba_max.dt_criacao, 'yyyy')::int >= 2022
                                                 group by id_tipo_arquivo, id_beneficiario
                                                 order by id_beneficiario);

create temp table tmp_beneficiarios_ltda as (select min_id.id,
                                                    sba.id_beneficiario,
                                                    to_char(dt_criacao, 'yyyy-MM-dd')::date as data_criacao
                                             from (select min(id) as id, id_beneficiario
                                                   from tmp_beneficiarios_ltda_max as max_id
                                                   group by id_beneficiario) as min_id
                                                      inner join seguro.beneficiarios_arquivos sba on sba.id = min_id.id);

update seguro.beneficiarios_arquivos
set fl_vigencia_atual = 't'
from tmp_beneficiarios_ltda_max
where tmp_beneficiarios_ltda_max.id = seguro.beneficiarios_arquivos.id;

update seguro.beneficiarios
set dt_arquivo_antigo_vigencia_atual = data_criacao
from tmp_beneficiarios_ltda
where tmp_beneficiarios_ltda.id_beneficiario = seguro.beneficiarios.id;

create temp table tmp_beneficiarios_fisico_max as(select max(sba_max.id) as id, id_beneficiario
                                                  from seguro.beneficiarios_arquivos sba_max
                                                           inner join seguro.beneficiarios sb_max on sb_max.id = sba_max.id_beneficiario
                                                  where id_tipo_arquivo in (17, 3, 2, 11, 15, 19, 1)
                                                    and sb_max.id_tipo_beneficiario = 3
                                                    and to_char(sba_max.dt_criacao, 'yyyy')::int >= 2022
                                                  group by id_tipo_arquivo, id_beneficiario
                                                  order by id_beneficiario);

create temp table tmp_beneficiarios_fisico as (select min_id.id,
                                                      sba.id_beneficiario,
                                                      to_char(dt_criacao, 'yyyy-MM-dd')::date as data_criacao
                                               from (select min(id) as id, id_beneficiario
                                                     from tmp_beneficiarios_fisico_max as max_id
                                                     group by id_beneficiario) as min_id
                                                        inner join seguro.beneficiarios_arquivos sba on sba.id = min_id.id);

update seguro.beneficiarios_arquivos
set fl_vigencia_atual = 't'
from tmp_beneficiarios_fisico_max
where tmp_beneficiarios_fisico_max.id = seguro.beneficiarios_arquivos.id;

update seguro.beneficiarios
set dt_arquivo_antigo_vigencia_atual = data_criacao
from tmp_beneficiarios_fisico
where tmp_beneficiarios_fisico.id_beneficiario = seguro.beneficiarios.id;

create temp table tmp_beneficiarios_rural_max as (select max(sba_max.id) as id, id_beneficiario
                                                  from seguro.beneficiarios_arquivos sba_max
                                                           inner join seguro.beneficiarios sb_max on sb_max.id = sba_max.id_beneficiario
                                                  where id_tipo_arquivo in (8, 3, 7, 11, 21)
                                                    and sb_max.id_tipo_beneficiario = 4
                                                    and to_char(sba_max.dt_criacao, 'yyyy')::int >= 2022
                                                  group by id_tipo_arquivo, id_beneficiario
                                                  order by id_beneficiario);

create temp table tmp_beneficiarios_rural as (select min_id.id,
                                                     sba.id_beneficiario,
                                                     to_char(dt_criacao, 'yyyy-MM-dd')::date as data_criacao
                                              from (select min(id) as id, id_beneficiario
                                                    from tmp_beneficiarios_rural_max as max_id
                                                    group by id_beneficiario) as min_id
                                                       inner join seguro.beneficiarios_arquivos sba on sba.id = min_id.id);

update seguro.beneficiarios_arquivos
set fl_vigencia_atual = 't'
from tmp_beneficiarios_rural
where tmp_beneficiarios_rural.id = seguro.beneficiarios_arquivos.id;

update seguro.beneficiarios
set dt_arquivo_antigo_vigencia_atual = data_criacao
from tmp_beneficiarios_rural
where tmp_beneficiarios_rural.id_beneficiario = seguro.beneficiarios.id;

create temp table tmp_beneficiarios_sa_max as (select max(sba_max.id) as id, id_beneficiario
                                               from seguro.beneficiarios_arquivos sba_max
                                                        inner join seguro.beneficiarios sb_max on sb_max.id = sba_max.id_beneficiario
                                               where id_tipo_arquivo in (8, 3, 11, 9, 6)
                                                 and sb_max.id_tipo_beneficiario = 5
                                                 and to_char(sba_max.dt_criacao, 'yyyy')::int >= 2022
                                               group by id_tipo_arquivo, id_beneficiario
                                               order by id_beneficiario);

create temp table tmp_beneficiarios_sa as (select min_id.id,
                                                  sba.id_beneficiario,
                                                  to_char(dt_criacao, 'yyyy-MM-dd')::date as data_criacao
                                           from (select min(id) as id, id_beneficiario
                                                 from tmp_beneficiarios_sa_max as max_id
                                                 group by id_beneficiario) as min_id
                                                    inner join seguro.beneficiarios_arquivos sba on sba.id = min_id.id);

update seguro.beneficiarios_arquivos
set fl_vigencia_atual = 't'
from tmp_beneficiarios_sa
where tmp_beneficiarios_sa.id = seguro.beneficiarios_arquivos.id;

update seguro.beneficiarios
set dt_arquivo_antigo_vigencia_atual = data_criacao
from tmp_beneficiarios_sa
where tmp_beneficiarios_sa.id_beneficiario = seguro.beneficiarios.id;

CREATE TABLE sinistro.avisos_encerramento_data_base (
    id SERIAL NOT NULL,
    id_aviso_encerramento INTEGER NOT NULL,
    dt_base DATE,
    CONSTRAINT pk_aviso_encerramento_data_base PRIMARY KEY (id),
    CONSTRAINT fk_aviso_encerramento_data_base_aviso_encerramento FOREIGN KEY (id_aviso_encerramento) REFERENCES sinistro.avisos_encerramento (id)
) INHERITS (public.campos_default);
SQL
        );
    }

    public function down(): void
    {
        $this->execute(<<<SQL
ALTER TABLE seguro.beneficiarios DROP COLUMN dt_arquivo_antigo_vigencia_atual;
ALTER TABLE seguro.beneficiarios_arquivos DROP COLUMN fl_vigencia_atual;
DROP TABLE sinistro.avisos_encerramento_data_base;
SQL
        );
    }
}
