<?php
if (session_status() !== PHP_SESSION_ACTIVE) {
    session_start();
}

require_once __DIR__ . '/config.php';

function h($v) {
    return htmlspecialchars((string)$v, ENT_QUOTES, 'UTF-8');
}

function usuarioAtual() {
    return isset($_SESSION['localizacao_usuario']) && is_array($_SESSION['localizacao_usuario'])
        ? $_SESSION['localizacao_usuario']
        : null;
}

function exigirLogin() {
    if (!usuarioAtual()) {
        header('Location: login.php');
        exit;
    }
}

function exigirAdmin() {
    exigirLogin();
    $u = usuarioAtual();
    if (!isset($u['perfil']) || $u['perfil'] !== 'ADMIN') {
        http_response_code(403);
        exit('Acesso restrito ao administrador.');
    }
}

function csrfToken() {
    if (empty($_SESSION['csrf_localizacao'])) {
        if (function_exists('random_bytes')) {
            $_SESSION['csrf_localizacao'] = bin2hex(random_bytes(32));
        } elseif (function_exists('openssl_random_pseudo_bytes')) {
            $_SESSION['csrf_localizacao'] = bin2hex(openssl_random_pseudo_bytes(32));
        } else {
            $_SESSION['csrf_localizacao'] = hash('sha256', uniqid('', true) . mt_rand() . microtime(true));
        }
    }
    return $_SESSION['csrf_localizacao'];
}

function validarCsrf() {
    $recebido = isset($_POST['csrf']) ? (string)$_POST['csrf'] : '';
    if ($recebido === '' || !hash_equals(csrfToken(), $recebido)) {
        http_response_code(419);
        exit('Sessão expirada. Atualize a página e tente novamente.');
    }
}

function redirecionar($url) {
    header('Location: ' . $url);
    exit;
}
