<?php
/**
 * config/auth.php — Autenticación central del sitio.
 * Maneja sesión única `DEMO_av` con dos roles: 'admin' y 'empleado'.
 *
 *   - Cualquier página pública del sitio → av_require_login()
 *   - Páginas del panel /admin/         → av_require_admin()
 */

if (session_status() === PHP_SESSION_NONE) {
    ini_set('session.use_strict_mode', '1');
    ini_set('session.cookie_httponly', '1');
    if (!empty($_SERVER['HTTPS'])) {
        ini_set('session.cookie_secure', '1');
    }
    session_name('DEMO_av');
    session_start();
}

// ─────────────────────────────────────────────────────────────
// Helpers de URL — calcula la base del sitio en cualquier host
// ─────────────────────────────────────────────────────────────
function av_site_base(): string
{
    $script = str_replace('\\', '/', $_SERVER['SCRIPT_NAME'] ?? '/');
    $dir    = rtrim(str_replace('\\', '/', dirname($script)), '/');
    // Sube hasta llegar al docroot del proyecto. Para esto buscamos
    // index.php / login.php a partir de la ubicación del script.
    // Solución simple: contamos los segmentos relativos al docroot.
    // En este sitio, las páginas viven a profundidad variable (1, 2, 3).
    // Calculamos el "base" de raíz del proyecto buscando "/admin", "/pages",
    // "/includes", "/config" en la ruta y cortando ahí.
    foreach (['/admin', '/pages', '/includes', '/config'] as $marker) {
        $pos = strpos($dir, $marker);
        if ($pos !== false) {
            return substr($dir, 0, $pos) . '/';
        }
    }
    return $dir === '' ? '/' : $dir . '/';
}

// ─────────────────────────────────────────────────────────────
// Sesión
// ─────────────────────────────────────────────────────────────
function av_user(): ?array
{
    if (empty($_SESSION['av_uid'])) return null;
    return [
        'id'       => (int)$_SESSION['av_uid'],
        'username' => $_SESSION['av_username'] ?? '',
        'nombre'   => $_SESSION['av_nombre']   ?? '',
        'rol'      => $_SESSION['av_rol']      ?? 'empleado',
    ];
}

function av_is_logged(): bool { return !empty($_SESSION['av_uid']); }
function av_is_admin():  bool { return av_is_logged() && ($_SESSION['av_rol'] ?? '') === 'admin'; }

function av_nombre(): string
{
    return $_SESSION['av_nombre'] ?? 'Usuario';
}

function av_login(string $username, string $password): bool
{
    global $conn;
    if (!isset($conn) || !$conn) {
        require_once __DIR__ . '/conn.php';
    }
    $stmt = $conn->prepare(
        "SELECT id, username, password_hash, nombre, rol, activo
         FROM av_usuarios WHERE username = ? LIMIT 1"
    );
    $stmt->bind_param('s', $username);
    $stmt->execute();
    $row = $stmt->get_result()->fetch_assoc();
    $stmt->close();

    if (!$row || (int)$row['activo'] !== 1) return false;
    if (!password_verify($password, $row['password_hash'])) return false;

    session_regenerate_id(true);
    $_SESSION['av_uid']      = (int)$row['id'];
    $_SESSION['av_username'] = $row['username'];
    $_SESSION['av_nombre']   = $row['nombre'] ?? $row['username'];
    $_SESSION['av_rol']      = $row['rol']    ?? 'empleado';
    av_csrf();
    return true;
}

function av_logout(): void
{
    $_SESSION = [];
    if (ini_get('session.use_cookies')) {
        $p = session_get_cookie_params();
        setcookie(session_name(), '', time() - 42000,
            $p['path'], $p['domain'], $p['secure'], $p['httponly']);
    }
    session_destroy();
}

// ─────────────────────────────────────────────────────────────
// Guards (redirección)
// ─────────────────────────────────────────────────────────────
function av_require_login(): void
{
    if (av_is_logged()) return;
    $base = av_site_base();
    $back = $_SERVER['REQUEST_URI'] ?? '';
    header('Location: ' . $base . 'login.php?next=' . urlencode($back));
    exit;
}

function av_require_admin(): void
{
    av_require_login();
    if (av_is_admin()) return;
    $base = av_site_base();
    header('Location: ' . $base . 'index.php?msg=sin_permisos');
    exit;
}

// ─────────────────────────────────────────────────────────────
// CSRF
// ─────────────────────────────────────────────────────────────
function av_csrf(): string
{
    if (empty($_SESSION['av_csrf'])) {
        $_SESSION['av_csrf'] = bin2hex(random_bytes(32));
    }
    return $_SESSION['av_csrf'];
}

function av_csrf_field(): string
{
    return '<input type="hidden" name="_csrf" value="' . htmlspecialchars(av_csrf(), ENT_QUOTES, 'UTF-8') . '">';
}

function av_csrf_verify(): void
{
    $token = $_POST['_csrf'] ?? '';
    if (!hash_equals($_SESSION['av_csrf'] ?? '', $token)) {
        http_response_code(403);
        exit('Token de seguridad inválido. <a href="javascript:history.back()">Volver</a>');
    }
}

// ─────────────────────────────────────────────────────────────
// Utilidades varias (compatibles con admin/auth.php anterior)
// ─────────────────────────────────────────────────────────────
if (!function_exists('h')) {
    function h(string $s): string
    {
        return htmlspecialchars($s, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
    }
}

if (!function_exists('fecha_es')) {
    function fecha_es(string $fecha): string
    {
        $meses = ['', 'enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio',
                  'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'];
        [$y, $m, $d] = explode('-', $fecha);
        return (int)$d . ' de ' . $meses[(int)$m] . ' de ' . $y;
    }
}
