<?php
/**
 * Arquivo de declaração da classe PermissaoDAO.
 */
class PermissaoDAO
{
    private $conexao;

    /**
     * Método construtor.
     */
    public function __construct()
    {
        $this->conexao = Conexao::getInstancia();
    }

    /**
     * Método para inserir permissão.
     *
     * @param  int $perfil
     * @param  int $tela
     */
    public function inserePerfilTela($perfil = 0, $tela = 0)
    {
        $txtSql = 'INSERT INTO cp_permissoes (perfil_id, tela_id) VALUES (:perfil, :tela)';

        try {
            $sql = $this->conexao->getConexao()->prepare($txtSql);
            $sql->bindValue(':perfil', $perfil, PDO::PARAM_INT);
            $sql->bindValue(':tela', $tela, PDO::PARAM_INT);
            $sql->execute();
        } catch (PDOException $ex) {
            throw new BancoExcecao($ex->getMessage(), $txtSql, __FILE__, __CLASS__, __METHOD__, __LINE__);
        }

        $sql->closeCursor();
    }

    /**
     * Método para buscar o objeto.
     *
     * @param  int $id
     */
    public function buscar($id = 0)
    {
        $txtSql = 'SELECT * FROM cp_permissoes WHERE id = :id';

        try {
            $sql = $this->conexao->getConexao()->prepare($txtSql);
            $sql->bindValue(':id', $id, PDO::PARAM_INT);
            $sql->execute();
        } catch (PDOException $ex) {
            throw new BancoExcecao($ex->getMessage(), $txtSql, __FILE__, __CLASS__, __METHOD__, __LINE__);
        }

        $resultado = $sql->fetch(PDO::FETCH_ASSOC);
        $sql->closeCursor();

        if (!$resultado) {
            return null;
        }

        return $resultado;
    }

    /**
     * Método para alterar a permissão.
     *
     * @param  int $id
     * @param  string  $campo
     * @param  int $valor
     */
    public function mudaPermissao($id = 0, $campo = '', $valor = 0)
    {
        $txtSql = "UPDATE cp_permissoes SET {$campo} = :valor, atualizado_em = NOW() WHERE id = :id";

        try {
            $sql = $this->conexao->getConexao()->prepare($txtSql);
            $sql->bindValue(':valor', $valor, PDO::PARAM_INT);
            $sql->bindValue(':id', $id, PDO::PARAM_INT);
            $sql->execute();
            $sql->closeCursor();
        } catch (PDOException $ex) {
            throw new BancoExcecao($ex->getMessage(), $txtSql, __FILE__, __CLASS__, __METHOD__, __LINE__);
        }
    }

    /**
     * Método para carregar permissoes de uma tela especifica.
     *
     * @param  string  $telaSlug
     * @param  int $idUser
     */
    public function permissaoTela($telaSlug = '', $idUser = 0)
    {
        $txtSql = 'SELECT
                        cp_permissoes.consultar,
                        cp_permissoes.inserir,
                        cp_permissoes.editar,
                        cp_permissoes.excluir
                    FROM
                        cp_usuarios,
                        cp_permissoes,
                        cp_tela
                    WHERE
                        cp_tela.id = cp_permissoes.tela_id
                    AND
                        cp_permissoes.perfil_id = cp_usuarios.perfil_id
                    AND
                        cp_tela.slug = :tela
                    AND
                        cp_usuarios.id = :usuario';

        try {
            $sql = $this->conexao->getConexao()->prepare($txtSql);
            $sql->bindParam(':usuario', $idUser, PDO::PARAM_INT);
            $sql->bindParam(':tela', $telaSlug, PDO::PARAM_STR);
            $sql->execute();
        } catch (PDOException $ex) {
            throw new BancoExcecao($ex->getMessage(), $txtSql, __FILE__, __CLASS__, __METHOD__, __LINE__);
        }

        $resultado = $sql->fetch(PDO::FETCH_ASSOC);
        $sql->closeCursor();

        $arrPerm = array('consultar' => 0, 'inserir' => 0, 'editar' => 0, 'excluir' => 0);

        if (!$resultado) {
            return $arrPerm;
        }

        $arrPerm['consultar'] = $resultado['consultar'];
        $arrPerm['inserir'] = $resultado['inserir'];
        $arrPerm['editar'] = $resultado['editar'];
        $arrPerm['excluir'] = $resultado['excluir'];

        return $arrPerm;
    }

    /**
     * Método para carregar permissoes.
     *
     * @param  int $idPerfil
     * @return array
     */
    public function permissaoPerfil($idPerfil = 0)
    {
        $txtSql = 'SELECT
                        cp_permissoes.id as per_id,
                        cp_permissoes.perfil_id as per_perfil_id,
                        cp_permissoes.tela_id as per_tela_id,
                        cp_permissoes.consultar as per_consultar,
                        cp_permissoes.inserir as per_inserir,
                        cp_permissoes.editar as per_editar,
                        cp_permissoes.excluir as per_excluir,
                        cp_tela.nome as tel_nome,
                        cp_tela.slug as tel_slug
                    FROM cp_permissoes
                    INNER JOIN cp_tela ON cp_tela.id = cp_permissoes.tela_id
                    WHERE
                        cp_tela.excluido IS NULL
                    AND
                        cp_permissoes.perfil_id = :perfil';

        try {
            $sql = $this->conexao->getConexao()->prepare($txtSql);
            $sql->bindParam(':perfil', $idPerfil, PDO::PARAM_INT);
            $sql->execute();
        } catch (PDOException $ex) {
            throw new BancoExcecao($ex->getMessage(), $txtSql, __FILE__, __CLASS__, __METHOD__, __LINE__);
        }

        $resultado = $sql->fetchAll(PDO::FETCH_ASSOC);
        $sql->closeCursor();

        if (!$resultado) {
            return null;
        }

        $arrPermissoes = array();

        foreach ($resultado as $res) {
            $arrPermissoes[$res['per_tela_id']]['id'] = $res['per_id'];
            $arrPermissoes[$res['per_tela_id']]['tela_id'] = $res['per_tela_id'];
            $arrPermissoes[$res['per_tela_id']]['perfil_id'] = $res['per_perfil_id'];
            $arrPermissoes[$res['per_tela_id']]['nome'] = $res['tel_nome'];
            $arrPermissoes[$res['per_tela_id']]['slug'] = $res['tel_slug'];
            $arrPermissoes[$res['per_tela_id']]['consultar'] = $res['per_consultar'];
            $arrPermissoes[$res['per_tela_id']]['inserir'] = $res['per_inserir'];
            $arrPermissoes[$res['per_tela_id']]['editar'] = $res['per_editar'];
            $arrPermissoes[$res['per_tela_id']]['excluir'] = $res['per_excluir'];
        }

        return $arrPermissoes;
    }
}
