<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class Task2107152233 extends AbstractMigration
{
    private $idAlterarStatusAnalise;
    private $idTransferirPropostas;
    private $idDispensarPropostas;

    public function up(): void
    {
        $this->upMenus();
        $this->getIdMenus();
        $this->upPermissoes();
    }

    private function upPermissoes()
    {
        $usuarios = "'karina.silva', 'luana.beck', 'karina.figueiro', 'danielle.goncalves', 'sabrina.moura'";
        $usuarios .= ", 'angelo.silva', 'randal.brandolt', 'fabio.albarello', 'julio.nakamura', 'marcelo.zanardo'";
        $usuarios .= ", 'diego.campos', 'gabriel.gomes'";

        $this->execute(<<<SQL
INSERT INTO sistema.roles_acao (id_usuario_criacao, dt_criacao, id_role, id_acao) VALUES (3379, NOW(), 12, $this->idAlterarStatusAnalise);
INSERT INTO sistema.roles_acao (id_usuario_criacao, dt_criacao, id_role, id_acao) VALUES (3379, NOW(), 12, $this->idTransferirPropostas);
INSERT INTO sistema.roles_acao (id_usuario_criacao, dt_criacao, id_role, id_acao) VALUES (3379, NOW(), 12, $this->idDispensarPropostas);

INSERT INTO sistema.usuarios_acao (id_usuario_criacao, dt_criacao, id_usuario, id_acao)
     SELECT 3379 as id_usuario_criacao,
            NOW() as dt_criacao,
            id as id_usuario,
            $this->idAlterarStatusAnalise as id_acao
       FROM sistema.usuarios
      WHERE ds_nome_usuario in($usuarios)
        AND NOT EXISTS(SELECT id
                         FROM sistema.usuarios_acao ua
                        WHERE ua.id_usuario = id
                          AND ua.id_acao = $this->idAlterarStatusAnalise);

INSERT INTO sistema.usuarios_acao (id_usuario_criacao, dt_criacao, id_usuario, id_acao)
     SELECT 3379 as id_usuario_criacao,
            NOW() as dt_criacao,
            id as id_usuario,
            $this->idTransferirPropostas as id_acao
       FROM sistema.usuarios
      WHERE ds_nome_usuario in($usuarios)
        AND NOT EXISTS(SELECT id
                         FROM sistema.usuarios_acao ua
                        WHERE ua.id_usuario = id
                          AND ua.id_acao = $this->idTransferirPropostas);

INSERT INTO sistema.usuarios_acao (id_usuario_criacao, dt_criacao, id_usuario, id_acao)
     SELECT 3379 as id_usuario_criacao,
            NOW() as dt_criacao,
            id as id_usuario,
            $this->idDispensarPropostas as id_acao
       FROM sistema.usuarios
      WHERE ds_nome_usuario in($usuarios)
        AND NOT EXISTS(SELECT id
                         FROM sistema.usuarios_acao ua
                        WHERE ua.id_usuario = id
                          AND ua.id_acao = $this->idDispensarPropostas);

UPDATE sistema.usuarios_acao
   SET fl_permitido = true
  FROM sistema.usuarios usu
 WHERE ds_nome_usuario in($usuarios)
   AND usu.id = id_usuario
   AND id_acao in ($this->idAlterarStatusAnalise, $this->idTransferirPropostas, $this->idDispensarPropostas);
SQL
        );
    }

    private function upMenus()
    {
        $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 ('Alterar Status de Análise', 'seguro', 'vistoriapreviaempresa', 'alterarstatusanalise', '', 571, '', 'Alterar Status de Análise', 'A', '2021-08-03 14:15:01', 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 ('Transferir Propostas', 'seguro', 'vistoriapreviaempresa', 'transferirpropostas', '', 571, '', 'Transferir Propostas', 'A', '2021-08-03 14:15: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 ('Dispensar Propostas', 'seguro', 'vistoriapreviaempresa', 'dispensarpropostas', '', 571, '', 'Dispensar Propostas', '', '2021-08-03 14:16:29', 3379, nextval('sistema.acao_id_seq'::regclass));
SQL
        );
    }

    public function down(): void
    {
        $this->getIdMenus();
        $this->downPermissoes();
        $this->downMenus();
    }

    private function downMenus()
    {
        $this->execute(<<<SQL
DELETE FROM sistema.acao WHERE id in($this->idAlterarStatusAnalise, $this->idTransferirPropostas, $this->idDispensarPropostas);
SQL
        );
    }

    private function downPermissoes()
    {
        $this->execute(<<<SQL
DELETE FROM sistema.roles_acao WHERE id_acao in($this->idAlterarStatusAnalise, $this->idTransferirPropostas, $this->idDispensarPropostas);
DELETE FROM sistema.usuarios_acao WHERE id_acao in($this->idAlterarStatusAnalise, $this->idTransferirPropostas, $this->idDispensarPropostas);
SQL
        );
    }

    private function getIdMenus()
    {
        $this->idAlterarStatusAnalise = $this->idAlterarStatusAnalise();
        $this->idTransferirPropostas = $this->idTransferirPropostas();
        $this->idDispensarPropostas = $this->idDispensarPropostas();
    }

    private function idAlterarStatusAnalise()
    {
        $queryParent = $this->query("SELECT id FROM sistema.acao WHERE ds_label = 'Alterar Status de Análise' AND ds_module = 'seguro' AND ds_controller = 'vistoriapreviaempresa'");
        $rows = $queryParent->fetchAll();
        return $rows[0]['id'];
    }

    private function idTransferirPropostas()
    {
        $queryParent = $this->query("SELECT id FROM sistema.acao WHERE ds_label = 'Transferir Propostas' AND ds_module = 'seguro' AND ds_controller = 'vistoriapreviaempresa'");
        $rows = $queryParent->fetchAll();
        return $rows[0]['id'];
    }

    private function idDispensarPropostas()
    {
        $queryParent = $this->query("SELECT id FROM sistema.acao WHERE ds_label = 'Dispensar Propostas' AND ds_module = 'seguro' AND ds_controller = 'vistoriapreviaempresa'");
        $rows = $queryParent->fetchAll();
        return $rows[0]['id'];
    }
}
