<?php
require_once __DIR__ . '/../db.php';
require_once __DIR__ . '/../license.php';

if (session_status() === PHP_SESSION_NONE) {
    session_start();
}

function current_user() {
    if (!isset($_SESSION['user_id'])) {
        return null;
    }
    static $user = null;
    if ($user !== null) return $user;

    $pdo = db();
    $stmt = $pdo->prepare("SELECT * FROM users WHERE id = ? AND active = TRUE");
    $stmt->execute([$_SESSION['user_id']]);
    $user = $stmt->fetch();
    if (!$user) {
        session_destroy();
        return null;
    }
    return $user;
}

// Verifica só autenticação, sem checar licença (usado na página de ativação)
function require_session_only() {
    if (!current_user()) {
        header("Location: " . BASE_URL . "index.php?page=login");
        exit;
    }
}

function require_login() {
    // Primeiro: verifica autenticação — se não logado, vai para login (nunca para licença)
    if (!current_user()) {
        header("Location: " . BASE_URL . "index.php?page=login");
        exit;
    }

    // Página de ativação não verifica licença — evita loop
    $page = $_GET['page'] ?? '';
    if ($page === 'license_activate') return;

    // Segundo: verifica licença
    $lic = license_check();
    if ($lic['status'] === 'no_key') {
        require __DIR__ . '/../includes/license_activate_page.php';
        exit;
    }
    if ($lic['status'] === 'blocked') {
        require __DIR__ . '/../includes/license_blocked.php';
        exit;
    }
    $_SESSION['license_status']  = $lic['status'];
    $_SESSION['license_message'] = $lic['message'] ?? '';
}

function require_admin() {
    $user = current_user();
    if (!$user || $user['role'] !== 'admin') {
        http_response_code(403);
        echo "Acesso negado.";
        exit;
    }
}

function login($email, $password) {
    $pdo = db();
    $stmt = $pdo->prepare("SELECT * FROM users WHERE email = ? AND active = TRUE");
    $stmt->execute([$email]);
    $user = $stmt->fetch();
    if ($user && password_verify($password, $user['password_hash'])) {
        // #46 Verificação de e-mail pendente
        if (array_key_exists('email_verified', $user) && !$user['email_verified']) {
            return 'unverified';
        }
        if (!empty($user['totp_enabled'])) {
            session_regenerate_id(true);
            $_SESSION['pending_2fa_user_id'] = $user['id'];
            return '2fa';
        }
        session_regenerate_id(true);
        $_SESSION['user_id'] = $user['id'];
        // #48 Registrar sessão
        try {
            $ip  = $_SERVER['REMOTE_ADDR'] ?? '';
            $ua  = substr($_SERVER['HTTP_USER_AGENT'] ?? '', 0, 255);
            $pdo->prepare("INSERT INTO user_sessions (user_id, ip_address, user_agent) VALUES (?, ?, ?)")
                ->execute([$user['id'], $ip, $ua]);
        } catch (Throwable $e) { /* silently fail — tabela pode não existir */ }
        return true;
    }
    return false;
}

function logout() {
    session_destroy();
}
