<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class Task2012181654 extends AbstractMigration
{
    public function up(): void
    {
        $this->upNovosCamposCorretores();
        $this->upNovosStatus();
        $this->upAtualizacaoCorretores();
        $this->upTabelaCorretoresContatosAdicionais();
        $this->upMigracaoOutrosContatos();
        $this->upLiberacaoMenuPerfil();
        $this->upLiberacaoMenuUsuarios();
    }

    private function upNovosCamposCorretores()
    {
        $this->execute(<<<SQL
alter table sistema.corretores add column dt_url_cadastro date;
alter table sistema.corretores add column ds_url_cadastro varchar(100);
alter table sistema.corretores add column id_status int;
alter table sistema.corretores add column ds_observacao_status text;
alter table sistema.corretores add column fl_treinado boolean default false;

alter table sistema.corretores add CONSTRAINT fk_corretores_status FOREIGN KEY (id_status) REFERENCES sistema.status (id);
SQL
        );
    }

    private function upNovosStatus()
    {
        $this->execute(<<<SQL
insert into sistema.tipo_status(ds_tipo_status, ds_chave) values('Corretor', 'CORRETOR');
SQL
        );

        $query = $this->query("SELECT id FROM sistema.tipo_status WHERE ds_chave = 'CORRETOR'");
        $rows = $query->fetchAll();
        $idParent = $rows[0]['id'];

        $this->execute(<<<SQL
insert into sistema.status(ds_status, cd_status, ds_chave, id_tipo_status) values('Cadastro Inicial', 1, 'CADASTRO_INICIAL', $idParent);
insert into sistema.status(ds_status, cd_status, ds_chave, id_tipo_status) values('Em Andamento', 2, 'EM_ANDAMENTO', $idParent);
insert into sistema.status(ds_status, cd_status, ds_chave, id_tipo_status) values('Em Análise', 3, 'EM_ANALISE', $idParent);
insert into sistema.status(ds_status, cd_status, ds_chave, id_tipo_status) values('Aguardando Pendência', 4, 'AGUARDANDO_PENDENCIA', $idParent);
insert into sistema.status(ds_status, cd_status, ds_chave, id_tipo_status) values('Concluído/Finalizado', 5, 'CONCLUIDO_FINALIZADO', $idParent);
insert into sistema.status(ds_status, cd_status, ds_chave, id_tipo_status) values('Atualização de Cadastro', 6, 'ATUALIZACAO_CADASTRO', $idParent);
SQL
        );
    }

    private function upAtualizacaoCorretores()
    {
        $query = $this->query("SELECT id FROM sistema.status WHERE ds_chave = 'CONCLUIDO_FINALIZADO'");
        $rows = $query->fetchAll();
        $idParent = $rows[0]['id'];

        $this->execute(<<<SQL
update sistema.corretores set id_status = $idParent, fl_treinado = true;
SQL
        );

        $this->execute(<<<SQL
update sistema.corretores_enderecos set fl_principal = true where id_corretor in(237, 222, 216, 195, 362, 348, 320, 482, 257, 506, 97);
delete from sistema.corretores_enderecos where fl_principal is false;
SQL
        );
    }

    private function upTabelaCorretoresContatosAdicionais()
    {
        $this->execute(<<<SQL
create table sistema.contatos_adicionais (
  id SERIAL,
  id_usuario INTEGER NOT NULL,
  ds_nome nome,
  ds_email email,
  ds_telefone varchar(16),
  CONSTRAINT pk_contatos_adicionais PRIMARY KEY (id),
  CONSTRAINT fk_contatos_adicionais_usuarios FOREIGN KEY (id_usuario) REFERENCES sistema.usuarios (id)
) INHERITS (public.campos_default);
SQL
        );
    }

    private function upMigracaoOutrosContatos()
    {
        $this->execute(<<<SQL
insert into sistema.contatos_adicionais 
     select id_usuario_criacao, id_usuario_alteracao, dt_criacao, dt_alteracao, fl_ativo, fl_del, nextval('sistema.contatos_adicionais_id_seq'::regclass), id_usuario, ds_contato_outros, ds_email_contato_outros, ds_telefone_contato_outros 
       from sistema.corretores 
      where ds_contato_outros <> '' or ds_email_contato_outros <> '' or ds_telefone_contato_outros <> '';

insert into sistema.contatos_adicionais 
     select id_usuario_criacao, id_usuario_alteracao, dt_criacao, dt_alteracao, fl_ativo, fl_del, nextval('sistema.contatos_adicionais_id_seq'::regclass), id_usuario, ds_contato_outros, ds_email_contato_outros, ds_telefone_contato_outros 
       from sistema.corretores 
      where ds_contato_outros_2 <> '' or ds_email_contato_outros_2 <> '' or ds_telefone_contato_outros_2 <> '';
SQL
        );
    }

    public function down(): void
    {
        $query = $this->query("SELECT id FROM sistema.tipo_status WHERE ds_chave = 'CORRETOR'");
        $rows = $query->fetchAll();
        $idParent = $rows[0]['id'];

        $this->execute(<<<SQL
alter table sistema.corretores drop CONSTRAINT fk_corretores_status;

alter table sistema.corretores drop column dt_url_cadastro;
alter table sistema.corretores drop column ds_url_cadastro;
alter table sistema.corretores drop column id_status;
alter table sistema.corretores drop column ds_observacao_status;
alter table sistema.corretores drop column fl_treinado;

delete from sistema.status where id_tipo_status = $idParent;

delete from sistema.tipo_status where ds_chave = 'CORRETOR';

drop table sistema.contatos_adicionais cascade;
SQL
        );

        $this->downLiberacaoMenuPerfil();
        $this->downLiberacaoMenuUsuarios();
    }

    public function upLiberacaoMenuPerfil()
    {
        $this->execute(<<<SQL
DELETE FROM sistema.roles_acao WHERE id_role = 6 AND id_acao in(3, 4, 8, 107, 84, 754, 12, 88, 756, 102, 961);

insert into sistema.roles_acao (id_role, id_acao) values (6, 3);
insert into sistema.roles_acao (id_role, id_acao) values (6, 4);
insert into sistema.roles_acao (id_role, id_acao) values (6, 8);
insert into sistema.roles_acao (id_role, id_acao) values (6, 107);
insert into sistema.roles_acao (id_role, id_acao) values (6, 84);
insert into sistema.roles_acao (id_role, id_acao) values (6, 754);
insert into sistema.roles_acao (id_role, id_acao) values (6, 12);
insert into sistema.roles_acao (id_role, id_acao) values (6, 88);
insert into sistema.roles_acao (id_role, id_acao) values (6, 756);
insert into sistema.roles_acao (id_role, id_acao) values (6, 102);
insert into sistema.roles_acao (id_role, id_acao) values (6, 961);

DELETE FROM sistema.roles_acao WHERE id_role in(20, 4) AND id_acao in(1269, 1986);

INSERT INTO sistema.roles_acao (id_role, id_acao) VALUES (20, 1269);
INSERT INTO sistema.roles_acao (id_role, id_acao) VALUES (20, 1986);

INSERT INTO sistema.roles_acao (id_role, id_acao) VALUES (4, 1269);
INSERT INTO sistema.roles_acao (id_role, id_acao) VALUES (4, 1986);
SQL
);
    }

    public function upLiberacaoMenuUsuarios()
    {
        $this->execute(<<<SQL
update sistema.usuarios_acao set fl_permitido = true where id_usuario in(431, 385, 489, 2899) and id_acao in(3, 4, 8, 107, 84, 754, 12, 88, 756, 102, 961);
SQL
        );
    }

    public function downLiberacaoMenuPerfil()
    {
        $this->execute(<<<SQL
DELETE FROM sistema.roles_acao WHERE id_role = 6 AND id_acao in(3, 4, 8, 107, 84, 754, 12, 88, 756, 102, 961);
DELETE FROM sistema.roles_acao WHERE id_role in(20, 4) AND id_acao in(1269, 1986);
SQL
        );
    }

    public function downLiberacaoMenuUsuarios()
    {
        $this->execute(<<<SQL
update sistema.usuarios_acao set fl_permitido = false where id_usuario in(431, 385, 489, 2899) and id_acao in(3, 4, 8, 107, 84, 754, 12, 88, 756, 102, 961);
SQL
        );
    }
}
