<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class Task2305311159 extends AbstractMigration
{
    private int $idAcaoChamadosConfirmarContato;
    
    public function up(): void
    {
        $this->execute(<<<SQL
ALTER TABLE seguro.pendencias_vistoriador ADD COLUMN id_departamento INTEGER REFERENCES sistema.departamentos(id);
ALTER TABLE seguro.pendencias_vistoriador ADD COLUMN fl_liberar_descricao_chamado BOOLEAN default false;
UPDATE seguro.pendencias_vistoriador SET id_departamento = 26;
UPDATE seguro.pendencias_vistoriador SET fl_liberar_descricao_chamado = true WHERE id = 6;
ALTER TABLE seguro.pendencias_vistoriador ALTER COLUMN id_departamento SET NOT NULL;
UPDATE atendimento.tipo_chamado SET id_responsavel = 1854 WHERE id IN (112, 113);
UPDATE atendimento.tipo_chamado SET fl_destinatario_corretor = true WHERE id = 112;

INSERT INTO seguro.pendencias_vistoriador (id_usuario_criacao, ds_descricao, id_departamento, fl_liberar_descricao_chamado)
                                   VALUES (2068, 'O telefone informado não pertence ao segurado e/ou autorizado.', 23, false),
                                          (2068, 'A ligação foi atendida por outra pessoa, que desconhece o segurado', 23, false),
                                          (2068, 'Tentativas de ligação não foram completadas (número inexistente e/ou serviço indisponível).', 23, false),
                                          (2068, 'Segurado informou não possuir disponibilidade para acompanhar a vistoria.', 23, false),
                                          (2068, 'Segurado não atende as ligações para agendamento.', 23, false),
                                          (2068, 'Outra Situação.', 23, true);

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 ('Solicitar Confirmação Contato', 'sinistro2', 'processo', 'solicitarconfirmacaocontato', '', 1597, '', 'Solicitar Confirmação Contato', 'A', '2023-08-28 13:47:45', 3379, nextval('sistema.acao_id_seq'::regclass)),
                         ('Chamado Confirmar contato', 'sinistro2', 'chamadosconfirmarcontato', 'index', '', 1698, '', 'Chamado Confirmar contato', 'M', '2023-08-28 13:39:26', 3379, nextval('sistema.acao_id_seq'::regclass));
SQL
);

        $this->idAcaoChamadosConfirmarContato = $this->getIdAcaoChamadosConfirmarContato();

        $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', 'sinistro2', 'chamadosconfirmarcontato', 'form', 'id', {$this->idAcaoChamadosConfirmarContato}, 'edit.png', '0', 'L', '2023-08-28 13:39:26', 3379, nextval('sistema.acao_id_seq'::regclass)),
                         ('Ativar/Desativar', 'sinistro2', 'chamadosconfirmarcontato', 'active', 'id', {$this->idAcaoChamadosConfirmarContato}, 'active.png', '1', 'L', '2023-08-28 13:39:26', 3379, nextval('sistema.acao_id_seq'::regclass)),
                         ('Deletar', 'sinistro2', 'chamadosconfirmarcontato', 'delete', 'id', {$this->idAcaoChamadosConfirmarContato}, 'delete.png', '2', 'L', '2023-08-28 13:39:26', 3379, nextval('sistema.acao_id_seq'::regclass));
SQL
        );

        $idAcaoSolicitacaoConfirmarContato = $this->getAcoesSolicitacaoConfirmarContato();

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

        $acoesChamadosConfirmarContato = $this->getAcoesChamadosConfirmarContato();

        foreach ($acoesChamadosConfirmarContato as $acao) {
            $this->execute(<<<SQL
INSERT INTO sistema.roles_acao (id_role, id_acao) VALUES (16, {$acao['id']});
SQL
            );
        }
    }

    public function down(): void
    {
        $this->execute(<<<SQL
UPDATE atendimento.tipo_chamado SET fl_destinatario_corretor = false WHERE id = 112;
UPDATE atendimento.tipo_chamado SET id_responsavel = 3971 WHERE id IN (112, 113);
DELETE FROM seguro.pendencias_vistoriador WHERE id_departamento = 23;
ALTER TABLE seguro.pendencias_vistoriador DROP COLUMN id_departamento;
ALTER TABLE seguro.pendencias_vistoriador DROP COLUMN fl_liberar_descricao_chamado;
SQL
);
        $this->idAcaoChamadosConfirmarContato = $this->getIdAcaoChamadosConfirmarContato();
        $idAcaoSolicitacaoConfirmarContato = $this->getAcoesSolicitacaoConfirmarContato();

        $this->execute(<<<SQL
DELETE FROM sistema.roles_acao WHERE id_acao = {$this->idAcaoChamadosConfirmarContato};
DELETE FROM sistema.acao WHERE id_parent = {$this->idAcaoChamadosConfirmarContato};
DELETE FROM sistema.acao WHERE id in ({$this->idAcaoChamadosConfirmarContato}, {$idAcaoSolicitacaoConfirmarContato});
SQL
        );
    }

    private function getAcoesChamadosConfirmarContato() : array
    {
        return $this->fetchAll("SELECT id FROM sistema.acao WHERE id_parent = {$this->idAcaoChamadosConfirmarContato}");
    }

    private function getIdAcaoChamadosConfirmarContato() : int
    {
        $row = $this->fetchRow("SELECT id FROM sistema.acao WHERE ds_module = 'sinistro2' AND ds_controller = 'chamadosconfirmarcontato' AND ds_action = 'index'");

        return (int)$row['id'];
    }

    private function getAcoesSolicitacaoConfirmarContato() : int
    {
        $row = $this->fetchRow("SELECT id FROM sistema.acao WHERE ds_module = 'sinistro2' AND ds_controller = 'processo' AND ds_action = 'solicitarconfirmacaocontato'");

        return (int)$row['id'];
    }
}
