<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class Task2305121615 extends AbstractMigration
{
    private int $idAcaoPendenciasVistoriador;

    public function up(): void
    {
        $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 ('Deletar Vistoria', 'seguro', 'vistoriapreviaempresa', 'deletarvistoria', '', 571, '', 'Deletar Vistoria', 'A', '2023-05-22 14:10:56', 3379, nextval('sistema.acao_id_seq'::regclass))
                        ,('Configurações', 'seguro', 'vistoriaprevia', 'configuracoes', '', 421, '', 'Configurações', 'M', '2023-05-23 10:13:28', 3379, nextval('sistema.acao_id_seq'::regclass))
                        ,('Solicitar Confirmação Contato', 'seguro', 'vistoriapreviaempresa', 'solicitarconfirmacaocontato', '', 571, '', 'Solicitar Confirmação Contato', 'A', '2023-05-24 11:06:11', 3379, nextval('sistema.acao_id_seq'::regclass));;
SQL
        );

        $idAcaoConfiguracoes = $this->getIdAcaoConfiguracoes();

        $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 ('Pendências Vistoriador', 'seguro', 'pendenciasvistoriador', 'index', '', {$idAcaoConfiguracoes}, '', 'Pendências Vistoriador', 'M', '2023-05-23 10:15:52', 3379, nextval('sistema.acao_id_seq'::regclass));
SQL
        );

        $this->idAcaoPendenciasVistoriador = $this->getIdAcaoPendenciasVistoriador();

        $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', 'seguro', 'pendenciasvistoriador', 'form', 'id', {$this->idAcaoPendenciasVistoriador}, 'edit.png', '0', 'L', '2023-05-23 10:58:53', 3379, nextval('sistema.acao_id_seq'::regclass))
                        ,('Ativar/Desativar', 'seguro', 'pendenciasvistoriador', 'active', 'id', {$this->idAcaoPendenciasVistoriador}, 'active.png', '1', 'L', '2023-05-23 10:58:53', 3379, nextval('sistema.acao_id_seq'::regclass))
                        ,('Deletar', 'seguro', 'pendenciasvistoriador', 'delete', 'id', {$this->idAcaoPendenciasVistoriador}, 'delete.png', '2', 'L', '2023-05-23 10:58:53', 3379, nextval('sistema.acao_id_seq'::regclass));
SQL
        );

        $idAcaoDeletarVistoria = $this->getIdAcaoDeletarVistoria();
        $idAcaoSolicitacaoConfirmarContato = $this->getAcoesSolicitacaoConfirmarContato();

        $this->execute(<<<SQL
INSERT INTO sistema.usuarios_acao (id_usuario, id_acao) VALUES (3648, {$idAcaoDeletarVistoria})
                                                              ,(1039, {$idAcaoDeletarVistoria})
                                                              ,(1033, {$idAcaoDeletarVistoria})
                                                              ,(1032, {$idAcaoDeletarVistoria})
                                                              ,(1968, {$idAcaoDeletarVistoria});

INSERT INTO sistema.roles_acao (id_role, id_acao) VALUES (20, {$idAcaoConfiguracoes});
INSERT INTO sistema.roles_acao (id_role, id_acao) VALUES (20, {$this->idAcaoPendenciasVistoriador});
INSERT INTO sistema.roles_acao (id_role, id_acao) VALUES (20, {$idAcaoSolicitacaoConfirmarContato});
INSERT INTO sistema.roles_acao (id_role, id_acao) VALUES (18, {$idAcaoSolicitacaoConfirmarContato});
INSERT INTO sistema.roles_acao (id_role, id_acao) VALUES (30, {$idAcaoSolicitacaoConfirmarContato});

CREATE TABLE seguro.pendencias_vistoriador (
    id SERIAL,
    ds_descricao VARCHAR(150) NOT NULL,
    CONSTRAINT pk_pendencias_vistoriador PRIMARY KEY (id)
) INHERITS (public.campos_default);

INSERT INTO seguro.pendencias_vistoriador (ds_descricao) VALUES ('O telefone informado não pertence ao Segurado e/ou Autorizado.'),
                                                                        ('A ligação foi atendida por outra pessoa, que desconhece o Segurado.'),
                                                                        ('Tentativas de ligação não foram completadas (número inexistente e/ou serviço indisponível).'),
                                                                        ('Segurado informou não possuir disponibilidade para acompanhar a vistoria.'),
                                                                        ('Segurado desconhece a efetivação do seguro e/ou informa ter solicitado Cancelamento.'),
                                                                        ('Outra situação.');

CREATE TABLE atendimento.chamados_telefones (
    id SERIAL,
    id_chamado INT NOT NULL,
    ds_telefone telefone NOT NULL,
    CONSTRAINT pk_chamados_telefones PRIMARY KEY (id),
    CONSTRAINT fk_chamados_telefones_chamados FOREIGN KEY (id_chamado) REFERENCES atendimento.chamados (id)
) INHERITS (public.campos_default);
SQL
        );

        $acoesPendenciasVistoriador = $this->getAcoesPendeciasVistoriador();

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

    public function down(): void
    {
        $idAcaoDeletarVistoria = $this->getIdAcaoDeletarVistoria();
        $idAcaoConfiguracoes = $this->getIdAcaoConfiguracoes();
        $this->idAcaoPendenciasVistoriador = $this->getIdAcaoPendenciasVistoriador();
        $idAcaoSolicitacaoConfirmarContato = $this->getAcoesSolicitacaoConfirmarContato();

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

DROP TABLE atendimento.chamados_telefones;
DROP TABLE seguro.pendencias_vistoriador;
SQL
        );
    }

    private function getIdAcaoDeletarVistoria()
    {
        $row = $this->fetchRow("SELECT id FROM sistema.acao WHERE ds_module = 'seguro' AND ds_controller = 'vistoriapreviaempresa' AND ds_action = 'deletarvistoria'");

        return $row['id'];
    }

    private function getIdAcaoConfiguracoes()
    {
        $row = $this->fetchRow("SELECT id FROM sistema.acao WHERE ds_module = 'seguro' AND ds_controller = 'vistoriaprevia' AND ds_action = 'configuracoes'");

        return $row['id'];
    }

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

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

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

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

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