<?php
/*
desenvolvedor: luciano donizeti
mania de script: www.maniadescript.com.br
whatsapp 43998240911
*/

/**
 * Helper de permissões operacionais para administradores auxiliares/revendedores.
 * Mantém o admin principal (nível 1) sempre liberado e permite limitar usuários nível 2/3.
 */

if (!function_exists('adminPermDebug')) {
    function adminPermDebug($message) {
        @error_log(date('Y-m-d H:i:s') . ' - ' . $message . "\n", 3, __DIR__ . '/session_debug.log');
    }
}

if (!function_exists('adminPermPdo')) {
    function adminPermPdo() {
        require_once __DIR__ . '/db/configdb.php';
        return new PDO(
            'mysql:host=' . DB_HOST . ';port=' . DB_PORT . ';dbname=' . DB_NAME . ';charset=utf8mb4',
            DB_USER,
            DB_PASS,
            array(
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
                PDO::ATTR_EMULATE_PREPARES => false
            )
        );
    }
}

if (!function_exists('adminPermEnsureSchema')) {
    function adminPermEnsureSchema($pdo) {
        try {
            $stmtBloqueio = $pdo->query("SHOW COLUMNS FROM usuarios LIKE 'bloquear_credenciais'");
            if (!$stmtBloqueio->fetch()) {
                $pdo->exec("ALTER TABLE usuarios ADD COLUMN bloquear_credenciais TINYINT(1) NOT NULL DEFAULT 0 COMMENT '1=bloqueia alteracao propria de usuario e senha' AFTER ativo");
            }

            $columns = array(
                'pode_alterar_logo_cards' => "ALTER TABLE usuarios ADD COLUMN pode_alterar_logo_cards TINYINT(1) NOT NULL DEFAULT 1 COMMENT '1=permite alterar logos dos cards/banners' AFTER limite_geracoes_dia",
                'pode_alterar_background' => "ALTER TABLE usuarios ADD COLUMN pode_alterar_background TINYINT(1) NOT NULL DEFAULT 1 COMMENT '1=permite alterar planos de fundo/backgrounds' AFTER pode_alterar_logo_cards",
                'pode_gerenciar_admins' => "ALTER TABLE usuarios ADD COLUMN pode_gerenciar_admins TINYINT(1) NOT NULL DEFAULT 0 COMMENT '1=permite acessar gerenciamento de admins/revendedores' AFTER pode_alterar_background"
            );

            foreach ($columns as $column => $sql) {
                $stmt = $pdo->query("SHOW COLUMNS FROM usuarios LIKE " . $pdo->quote($column));
                if (!$stmt->fetch()) {
                    try {
                        $pdo->exec($sql);
                    } catch (Exception $e) {
                        // Hospedagens antigas podem falhar por causa do AFTER quando a coluna anterior não existe.
                        $fallback = preg_replace('/ AFTER [a-zA-Z0-9_]+$/', '', $sql);
                        $pdo->exec($fallback);
                    }
                }
            }

            // O admin principal nunca fica travado pelas permissões operacionais.
            $pdo->exec("UPDATE usuarios SET pode_alterar_logo_cards = 1, pode_alterar_background = 1, pode_gerenciar_admins = 1, bloquear_credenciais = 0 WHERE nivel = 1");
        } catch (Exception $e) {
            adminPermDebug('Erro ao garantir schema de permissões de admin auxiliar: ' . $e->getMessage());
        }
    }
}

if (!function_exists('adminPermUsuario')) {
    function adminPermUsuario($pdo, $usuarioId) {
        adminPermEnsureSchema($pdo);
        $stmt = $pdo->prepare("SELECT id, nivel, COALESCE(bloquear_credenciais, 0) AS bloquear_credenciais, COALESCE(pode_alterar_logo_cards, 1) AS pode_alterar_logo_cards, COALESCE(pode_alterar_background, 1) AS pode_alterar_background, COALESCE(pode_gerenciar_admins, 0) AS pode_gerenciar_admins FROM usuarios WHERE id = ? LIMIT 1");
        $stmt->execute(array((int)$usuarioId));
        $user = $stmt->fetch();
        return $user ? $user : null;
    }
}

if (!function_exists('adminPermPode')) {
    function adminPermPode($pdo, $usuarioId, $permissao) {
        $user = adminPermUsuario($pdo, $usuarioId);
        if (!$user) return false;
        $nivel = (int)$user['nivel'];
        if ($nivel === 1) return true;

        switch ($permissao) {
            case 'alterar_logo_cards':
            case 'pode_alterar_logo_cards':
                return (int)$user['pode_alterar_logo_cards'] === 1;
            case 'alterar_background':
            case 'pode_alterar_background':
                return (int)$user['pode_alterar_background'] === 1;
            case 'alterar_credenciais':
            case 'pode_alterar_credenciais':
                return (int)$user['bloquear_credenciais'] !== 1;
            case 'gerenciar_admins':
            case 'pode_gerenciar_admins':
                return (int)$user['pode_gerenciar_admins'] === 1;
            default:
                return false;
        }
    }
}

if (!function_exists('adminPermValorPost')) {
    function adminPermValorPost($nome, $padrao = 0) {
        return isset($_POST[$nome]) ? 1 : (int)$padrao;
    }
}

if (!function_exists('adminPermNomeTipoUsuario')) {
    function adminPermNomeTipoUsuario($nivel) {
        $nivel = (int)$nivel;
        if ($nivel === 1) return 'Admin Principal';
        if ($nivel === 2) return 'Admin Auxiliar';
        if ($nivel === 3) return 'Sub-Revendedor';
        return 'Usuário';
    }
}

if (!function_exists('adminPermRenderAcessoNegado')) {
    function adminPermRenderAcessoNegado($titulo, $mensagem) {
        $pageTitle = $titulo;
        include __DIR__ . '/includes/header.php';
        echo '<div class="content-card" style="max-width:760px;margin:2rem auto;padding:2rem;">';
        echo '<h1 style="margin-bottom:1rem;color:#ff6b6b;"><i class="fas fa-lock"></i> Acesso negado</h1>';
        echo '<p style="font-size:1rem;line-height:1.6;">' . htmlspecialchars($mensagem, ENT_QUOTES, 'UTF-8') . '</p>';
        echo '<p style="margin-top:1rem;color:var(--text-muted);">Peça ao admin principal para liberar esta permissão no menu Admins / Revendedores.</p>';
        echo '</div>';
        include __DIR__ . '/includes/footer.php';
    }
}
?>
