<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class Task2208172127 extends AbstractMigration
{
    public function up(): void
    {
        $this->execute(<<<SQL
ALTER TABLE sistema.funcionarios ADD COLUMN id_tipo_carteira_profissional INTEGER;
ALTER TABLE sistema.funcionarios ALTER COLUMN ds_nome_guerra DROP NOT NULL;

update sistema.funcionarios sf
set id_tipo_carteira_profissional = 2
from sistema.usuarios su
where su.id = sf.id_usuario
  and su.tp_usuario = 'V'
  and sf.ds_crea <> ''
  and sf.cpf_cnpj <> ''
  and sf.ds_crea = regexp_replace(sf.cpf_cnpj, '[^0-9]', '', 'g');

update sistema.funcionarios sf
set id_tipo_carteira_profissional = 1
from sistema.usuarios su
where su.id = sf.id_usuario
  and su.tp_usuario = 'V'
  and id_tipo_carteira_profissional is null;

CREATE table log.log_alteracoes_cadastro_funcionarios (
    id SERIAL,
    id_funcionario INTEGER NOT NULL,
    ds_alteracoes jsonb,
    CONSTRAINT pk_log_alteracoes_cadastro_funcionarios PRIMARY KEY (id),
    CONSTRAINT fk_log_alteracoes_cadastro_funcionarios FOREIGN KEY (id_funcionario) REFERENCES sistema.funcionarios (id)
) INHERITS (public.campos_default);

INSERT INTO sistema.tipo_telefone (id_usuario_criacao, dt_criacao, id, tp_telefone) VALUES (2068, now(), 6, 'Celular Particular'),
                                                                                           (2068, now(), 7, 'Celular Empresa'),
                                                                                           (2068, now(), 8, 'Fixo Empresa'),
                                                                                           (2068, now(), 9, 'WhatsApp');

SELECT setval('sistema.tipo_telefone_id_seq', 9, true);
SQL
        );

        $this->execute(<<<SQL
INSERT INTO sistema.acao (ds_label, ds_module, ds_controller, ds_action, ds_param, id_parent, ds_image, ds_descricao, fl_tipo, dt_criacao, id_usuario_criacao, id) VALUES ('Vistoriadores e Auxiliares', 'sistema', 'vistoriadoresauxiliares', 'index', '', 4, '', 'Vistoriadores e Auxiliares', 'M', '2022-09-22 14:20:59', 3379, nextval('sistema.acao_id_seq'::regclass));
INSERT INTO sistema.acao (ds_label, ds_module, ds_controller, ds_action, ds_param, id_parent, ds_image, ds_descricao, fl_tipo, dt_criacao, id_usuario_criacao, id) VALUES ('Relatório Cadastros de Peritos', 'relatorio', 'sinistro', 'cadastrosperitos', 'formcadastrosperitos', 332, '', 'Relatório Cadastros de Peritos', 'R', '2022-10-10 09:54:06', 3379, nextval('sistema.acao_id_seq'::regclass));
SQL
);
        $queryParent = $this->query("SELECT id FROM sistema.acao WHERE ds_label = 'Vistoriadores e Auxiliares' AND ds_module = 'sistema' AND ds_controller = 'vistoriadoresauxiliares'");
        $rows = $queryParent->fetchAll();
        $idAcao = $rows[0]['id'];

        $this->execute(<<<SQL
INSERT INTO sistema.acao (ds_label, ds_module, ds_controller, ds_action, ds_param, id_parent, ds_image, nr_ordem, fl_tipo, dt_criacao, id_usuario_criacao, id) VALUES ('Editar', 'sistema', 'vistoriadoresauxiliares', 'form', 'id', $idAcao, 'edit.png', '0', 'L', '2022-09-22 14:20:59', 3379, nextval('sistema.acao_id_seq'::regclass));
INSERT INTO sistema.acao (ds_label, ds_module, ds_controller, ds_action, ds_param, id_parent, ds_image, nr_ordem, fl_tipo, dt_criacao, id_usuario_criacao, id) VALUES ('Ativar/Desativar', 'sistema', 'vistoriadoresauxiliares', 'active', 'id', $idAcao, 'active.png', '1', 'L', '2022-09-22 14:20:59', 3379, nextval('sistema.acao_id_seq'::regclass));
INSERT INTO sistema.acao (ds_label, ds_module, ds_controller, ds_action, ds_param, id_parent, ds_image, nr_ordem, fl_tipo, dt_criacao, id_usuario_criacao, id) VALUES ('Deletar', 'sistema', 'vistoriadoresauxiliares', 'delete', 'id', $idAcao, 'delete.png', '2', 'L', '2022-09-22 14:20:59', 3379, nextval('sistema.acao_id_seq'::regclass));

INSERT INTO sistema.roles_acao (id_role, id_acao) VALUES (16, {$idAcao});
INSERT INTO sistema.roles_acao (id_role, id_acao) VALUES (18, 3);
INSERT INTO sistema.roles_acao (id_role, id_acao) VALUES (18, 4);
INSERT INTO sistema.roles_acao (id_role, id_acao) VALUES (18, {$idAcao});
INSERT INTO sistema.roles_acao (id_role, id_acao) VALUES (30, 3);
INSERT INTO sistema.roles_acao (id_role, id_acao) VALUES (30, 4);
INSERT INTO sistema.roles_acao (id_role, id_acao) VALUES (30, {$idAcao});
SQL
        );

        $queryParent = $this->query("SELECT id FROM sistema.acao WHERE ds_module = 'sistema' AND ds_controller = 'vistoriadoresauxiliares' AND ds_action = 'form'");
        $rows = $queryParent->fetchAll();
        $idAcao = $rows[0]['id'];

        $this->execute(<<<SQL
INSERT INTO sistema.roles_acao (id_role, id_acao) VALUES (16, {$idAcao});
INSERT INTO sistema.roles_acao (id_role, id_acao) VALUES (18, {$idAcao});
INSERT INTO sistema.roles_acao (id_role, id_acao) VALUES (30, {$idAcao});
SQL
        );

        $queryParent = $this->query("SELECT id FROM sistema.acao WHERE ds_module = 'sistema' AND ds_controller = 'vistoriadoresauxiliares' AND ds_action = 'active'");
        $rows = $queryParent->fetchAll();
        $idAcao = $rows[0]['id'];

        $this->execute(<<<SQL
INSERT INTO sistema.roles_acao (id_role, id_acao) VALUES (16, {$idAcao});
INSERT INTO sistema.roles_acao (id_role, id_acao) VALUES (18, {$idAcao});
INSERT INTO sistema.roles_acao (id_role, id_acao) VALUES (30, {$idAcao});
SQL
        );

        $queryParent = $this->query("SELECT id FROM sistema.acao WHERE ds_module = 'sistema' AND ds_controller = 'vistoriadoresauxiliares' AND ds_action = 'delete'");
        $rows = $queryParent->fetchAll();
        $idAcao = $rows[0]['id'];

        $this->execute(<<<SQL
INSERT INTO sistema.roles_acao (id_role, id_acao) VALUES (16, {$idAcao});
INSERT INTO sistema.roles_acao (id_role, id_acao) VALUES (18, {$idAcao});
INSERT INTO sistema.roles_acao (id_role, id_acao) VALUES (30, {$idAcao});
SQL
        );

        $this->execute(<<<SQL
INSERT INTO sistema.tipo_status (ds_tipo_status, ds_chave) VALUES ('Cadastro de Vistoriadores', 'CADASTRO_VISTORIADORES');
SQL
        );

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

        $this->execute(<<<SQL
INSERT INTO sistema.status (ds_status, cd_status, ds_chave, id_tipo_status) VALUES ('Conferido', 1, 'CONFERIDO', {$idTipoStatus});
INSERT INTO sistema.status (ds_status, cd_status, ds_chave, id_tipo_status) VALUES ('Não Conferido', 2, 'NAO_CONFERIDO', {$idTipoStatus});
INSERT INTO sistema.status (ds_status, cd_status, ds_chave, id_tipo_status) VALUES ('Pendente', 3, 'PENDENTE', {$idTipoStatus});

CREATE TABLE sistema.vistoriadores_status (
    id SERIAL,
    id_funcionario INTEGER,
    id_status INTEGER,
    ds_observacao TEXT,
    fl_cadastro_inicial BOOLEAN DEFAULT FALSE,
    CONSTRAINT pk_vistoriadores_status PRIMARY KEY (id),
    CONSTRAINT fk_vistoriadores_status_funcionarios FOREIGN KEY (id_funcionario) REFERENCES sistema.funcionarios (id),
    CONSTRAINT fk_vistoriadores_status_status FOREIGN KEY (id_status) REFERENCES sistema.status (id)
) INHERITS (public.campos_default);
SQL
        );

        $queryConferido = $this->query("SELECT id FROM sistema.status WHERE ds_chave = 'CONFERIDO'");
        $rowConferido = $queryConferido->fetchAll();
        $idConferido = $rowConferido[0]['id'];

        $queryNaoConferido = $this->query("SELECT id FROM sistema.status WHERE ds_chave = 'NAO_CONFERIDO'");
        $rowNaoConferido = $queryNaoConferido->fetchAll();
        $idNaoConferido = $rowNaoConferido[0]['id'];

        $this->execute(<<<SQL
INSERT INTO sistema.vistoriadores_status
     SELECT 3379 as id_usuario_criacao
            , null as id_usuario_alteracao
            , now() as dt_criacao
            , null as dt_alteracao
            , 't' as fl_ativo
            , 'f' as fl_del
            , nextval('sistema.vistoriadores_status_id_seq'::regclass) as id
            , sf.id as id_funcionario
            , {$idConferido} as id_status
            , '' as ds_observacao
       FROM sistema.funcionarios sf
            INNER JOIN sistema.usuarios su ON su.id = sf.id_usuario
      WHERE sf.fl_ativo is true
        AND su.tp_usuario = 'V'
        AND su.id_role in(18, 30);

INSERT INTO sistema.vistoriadores_status
     SELECT 3379 as id_usuario_criacao
            , null as id_usuario_alteracao
            , now() as dt_criacao
            , null as dt_alteracao
            , 't' as fl_ativo
            , 'f' as fl_del
            , nextval('sistema.vistoriadores_status_id_seq'::regclass) as id
            , sf.id as id_funcionario
            , {$idNaoConferido} as id_status
            , '' as ds_observacao
       FROM sistema.funcionarios sf
            INNER JOIN sistema.usuarios su ON su.id = sf.id_usuario
      WHERE sf.fl_ativo is false
        AND su.tp_usuario = 'V'
        AND su.id_role in(18, 30);
SQL
        );
    }

    public function down(): void
    {
        $queryParent = $this->query("SELECT id FROM sistema.acao WHERE ds_label = 'Vistoriadores e Auxiliares' AND ds_module = 'sistema' AND ds_controller = 'vistoriadoresauxiliares'");
        $rows = $queryParent->fetchAll();
        $idAcao = $rows[0]['id'];

        $this->execute(<<<SQL
DELETE FROM sistema.roles_acao WHERE id_role in(16, 18, 30) AND id_acao = {$idAcao};
DELETE FROM sistema.roles_acao WHERE id_role in(16, 18, 30) AND id_acao = 3;
DELETE FROM sistema.roles_acao WHERE id_role in(16, 18, 30) AND id_acao = 4;

DELETE FROM sistema.tipo_telefone WHERE id in(6, 7, 8, 9);
SELECT setval('sistema.tipo_telefone_id_seq', 5, true);
SQL
        );

        $queryParent = $this->query("SELECT id FROM sistema.acao WHERE ds_module = 'sistema' AND ds_controller = 'vistoriadoresauxiliares' AND ds_action = 'form'");
        $rows = $queryParent->fetchAll();
        $idAcao = $rows[0]['id'];

        $this->execute(<<<SQL
DELETE FROM sistema.roles_acao WHERE id_role in(16, 18, 30) AND id_acao = {$idAcao};
SQL
        );

        $queryParent = $this->query("SELECT id FROM sistema.acao WHERE ds_module = 'sistema' AND ds_controller = 'vistoriadoresauxiliares' AND ds_action = 'active'");
        $rows = $queryParent->fetchAll();
        $idAcao = $rows[0]['id'];

        $this->execute(<<<SQL
DELETE FROM sistema.roles_acao WHERE id_role in(16, 18, 30) AND id_acao = {$idAcao};
SQL
        );

        $queryParent = $this->query("SELECT id FROM sistema.acao WHERE ds_module = 'sistema' AND ds_controller = 'vistoriadoresauxiliares' AND ds_action = 'delete'");
        $rows = $queryParent->fetchAll();
        $idAcao = $rows[0]['id'];

        $this->execute(<<<SQL
DELETE FROM sistema.roles_acao WHERE id_role in(16, 18, 30) AND id_acao = {$idAcao};
SQL
        );

        $this->execute(<<<SQL
DROP TABLE log.log_alteracoes_cadastro_funcionarios;
ALTER TABLE sistema.funcionarios ALTER COLUMN ds_nome_guerra SET NOT NULL;
ALTER TABLE sistema.funcionarios DROP COLUMN id_tipo_carteira_profissional;
DELETE FROM sistema.acao WHERE ds_controller = 'vistoriadoresauxiliares';
DELETE FROM sistema.acao WHERE ds_module = 'relatorio' AND ds_controller = 'sinistro' AND ds_action = 'cadastrosperitos';
SQL
);
        $queryParent = $this->query("SELECT id FROM sistema.tipo_status WHERE ds_chave = 'CADASTRO_VISTORIADORES'");
        $rows = $queryParent->fetchAll();
        $idTipoStatus = $rows[0]['id'];

        $this->execute(<<<SQL
DELETE FROM sistema.status WHERE id_tipo_status = {$idTipoStatus};
DELETE FROM sistema.tipo_status WHERE ds_chave = 'CADASTRO_VISTORIADORES';
DROP TABLE sistema.vistoriadores_status;
SQL
        );
    }
}
