<?php
/**
 * Sistema de Autenticación
 * 
 * Maneja el login, logout y verificación de sesiones.
 * Roles: superadmin (todo), admin (usuarios + gestores), gestor (sin usuarios).
 */

require_once __DIR__ . '/../config/config.php';
require_once __DIR__ . '/db.php';

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

/** Usuario superadmin fijo: no se puede eliminar ni desactivar; solo él puede cambiar su contraseña */
define('SUPERADMIN_USUARIO', 'FabricioZ907');

/**
 * Verifica si el usuario está autenticado
 */
function isLoggedIn() {
    return isset($_SESSION['admin_id']) && isset($_SESSION['evento_id']);
}

/**
 * Requiere que el usuario esté autenticado
 * Redirige al login si no lo está
 */
function requireLogin() {
    if (!isLoggedIn()) {
        header('Location: ' . BASE_URL . ADMIN_PATH . '/login.php');
        exit;
    }
}

/**
 * Intenta iniciar sesión con usuario y contraseña
 * 
 * @param string $usuario Nombre de usuario
 * @param string $password Contraseña sin hashear
 * @return array Resultado con 'success' y opcionalmente 'message'
 */
function login($usuario, $password) {
    global $pdo;
    
    // Compatibilidad: si no existe columna rol, usar valor por defecto según usuario
    $tieneRol = false;
    try {
        $chk = $pdo->query("SHOW COLUMNS FROM administradores LIKE 'rol'");
        $tieneRol = $chk && $chk->rowCount() > 0;
    } catch (Exception $e) { /* ignorar */ }
    
    $sql = "
        SELECT a.id, a.evento_id, a.password_hash, a.nombre, a.email, e.activo as evento_activo
        " . ($tieneRol ? ", a.rol" : "") . "
        FROM administradores a
        INNER JOIN eventos_base e ON a.evento_id = e.id
        WHERE a.usuario = ? AND a.activo = 1
    ";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([$usuario]);
    $admin = $stmt->fetch(PDO::FETCH_ASSOC);
    
    if ($admin && password_verify($password, $admin['password_hash'])) {
        if (!$admin['evento_activo']) {
            return ['success' => false, 'message' => 'El evento está inactivo'];
        }
        
        $_SESSION['admin_id'] = $admin['id'];
        $_SESSION['evento_id'] = $admin['evento_id'];
        $_SESSION['admin_nombre'] = $admin['nombre'];
        $_SESSION['admin_usuario'] = $usuario;
        $_SESSION['admin_rol'] = ($tieneRol && isset($admin['rol'])) ? $admin['rol'] : ($usuario === SUPERADMIN_USUARIO ? 'superadmin' : 'gestor');
        
        // Actualizar último acceso
        $stmt = $pdo->prepare("UPDATE administradores SET ultimo_acceso = NOW() WHERE id = ?");
        $stmt->execute([$admin['id']]);
        
        return ['success' => true];
    }
    
    return ['success' => false, 'message' => 'Usuario o contraseña incorrectos'];
}

/**
 * Cierra la sesión del usuario
 */
function logout() {
    session_destroy();
    header('Location: ' . BASE_URL . ADMIN_PATH . '/login.php');
    exit;
}

/**
 * Obtiene el ID del evento actual
 */
function getEventoId() {
    return $_SESSION['evento_id'] ?? null;
}

/**
 * Obtiene el ID del evento actual (alias para compatibilidad)
 * @deprecated Usar getEventoId() en su lugar
 */
function getBodaId() {
    return getEventoId();
}

/**
 * Obtiene el ID del administrador actual
 */
function getAdminId() {
    return $_SESSION['admin_id'] ?? null;
}

/**
 * Obtiene el nombre del administrador actual
 */
function getAdminNombre() {
    return $_SESSION['admin_nombre'] ?? 'Administrador';
}

/**
 * Obtiene el rol del administrador actual (superadmin, admin, gestor)
 */
function getAdminRol() {
    return $_SESSION['admin_rol'] ?? 'gestor';
}

/**
 * Indica si el usuario actual es superadmin (FabricioZ907)
 */
function isSuperAdmin() {
    return (getAdminRol() === 'superadmin') || (($_SESSION['admin_usuario'] ?? '') === SUPERADMIN_USUARIO);
}

/**
 * Indica si el usuario puede actuar como admin (superadmin o admin)
 */
function isAdmin() {
    $rol = getAdminRol();
    return $rol === 'superadmin' || $rol === 'admin';
}

/**
 * Indica si el usuario puede gestionar la sección de usuarios (solo superadmin y admin)
 */
function canManageUsers() {
    return isSuperAdmin() || isAdmin();
}

/**
 * Indica si el usuario con id/usuario dado es el superadmin fijo (no eliminable ni desactivable)
 */
function isSuperAdminUser($idOrUsuario) {
    if (is_numeric($idOrUsuario)) {
        global $pdo;
        $stmt = $pdo->prepare("SELECT usuario FROM administradores WHERE id = ? LIMIT 1");
        $stmt->execute([$idOrUsuario]);
        $row = $stmt->fetch(PDO::FETCH_ASSOC);
        return $row && $row['usuario'] === SUPERADMIN_USUARIO;
    }
    return $idOrUsuario === SUPERADMIN_USUARIO;
}

