<?php

/**
 * Auth.php - Manejo de autenticación
 */

error_log("=== AUTH.PHP CARGADO ===");
error_log("Tipo de operación: " . $tipo);

// Incluir modelos necesarios
require_once __DIR__ . '/../../modelos/Usuario.php';
require_once __DIR__ . '/../../modelos/Auth.php';

// Función para generar token aleatorio
function generarToken($longitud = 32)
{
    $caracteres = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $token = '';
    for ($i = 0; $i < $longitud; $i++) {
        $token .= $caracteres[random_int(0, strlen($caracteres) - 1)];
    }
    return $token;
}

// Función para validar token y obtener usuario
function validateToken($conn, $authHeader)
{
    error_log("Validando token...");

    if (empty($authHeader)) {
        error_log("Header Authorization vacío");
        return null;
    }

    $token = str_replace('Bearer ', '', $authHeader);
    error_log("Token extraído: " . substr($token, 0, 20) . "...");

    // Aquí usamos el modelo Auth para verificar el JWT
    $auth = new Auth($conn);
    $userData = $auth->obtenerUsuarioDeToken($token);

    if ($userData) {
        error_log("Usuario validado: " . $userData['username']);
        return $userData;
    }

    return null;
}

// === LOGIN ===
if ($tipo === 'login') {
    error_log("=== PROCESANDO LOGIN ===");

    $username = isset($datapost['username']) ? $datapost['username'] : '';
    $password = isset($datapost['password']) ? $datapost['password'] : '';

    if (empty($username) || empty($password)) {
        sendResponse(false, "Usuario y contraseña son requeridos");
    }

    error_log("Intento de login para usuario: " . $username);

    try {
        $usuario = new Usuario($conn);
        $userData = $usuario->login($username, $password);

        if ($userData) {
            error_log("Login exitoso para: " . $username);

            // Generar JWT
            $auth = new Auth($conn);
            $token = $auth->generarJWT($userData);

            // Guardar sesión
            $usuario->guardarSesion(
                $userData['id'],
                hash('sha256', $token),
                $_SERVER['REMOTE_ADDR'] ?? 'unknown',
                $_SERVER['HTTP_USER_AGENT'] ?? 'unknown',
                date('Y-m-d H:i:s', time() + (24 * 60 * 60))
            );

            sendResponse(true, "Login exitoso", [
                'token' => $token,
                'usuario' => $userData,
                'expires_in' => 86400 // 24 horas
            ]);
        } else {
            error_log("Login fallido para: " . $username);
            sendResponse(false, "Usuario o contraseña incorrectos " . $username);
        }
    } catch (Exception $e) {
        error_log("Error en login: " . $e->getMessage());
        sendResponse(false, "Error al procesar login: " . $e->getMessage());
    }
}

// === LOGOUT ===
if ($tipo === 'logout') {
    error_log("=== PROCESANDO LOGOUT ===");

    $authHeader = $_SERVER['HTTP_AUTHORIZATION'] ?? '';
    if (empty($authHeader)) {
        $authHeader = getallheaders()['Authorization'] ?? '';
    }

    $user = validateToken($conn, $authHeader);

    if (!$user) {
        sendResponse(false, "No autorizado " . json_encode($authHeader) . " " . json_encode($user));
    }

    // Aquí podrías invalidar el token en la base de datos si lo deseas
    // Por ahora solo retornamos éxito
    sendResponse(true, "Sesión cerrada correctamente");
}

// === VERIFY TOKEN ===
if ($tipo === 'verify') {
    error_log("=== VERIFICANDO TOKEN ===");

    $authHeader = $_SERVER['HTTP_AUTHORIZATION'] ?? '';
    if (empty($authHeader)) {
        $authHeader = getallheaders()['Authorization'] ?? '';
    }

    error_log("Authorization header: " . $authHeader);

    $user = validateToken($conn, $authHeader);

    if (!$user) {
        error_log("Token inválido o usuario no encontrado");
        sendResponse(false, "Token inválido o expirado");
    }

    // Obtener permisos actualizados
    $usuario = new Usuario($conn);
    $permisos = $usuario->obtenerPermisos($user['sub']);
    $user['permisos'] = $permisos;

    sendResponse(true, "Token válido", [
        'usuario' => $user
    ]);
}

// === GET USER PROFILE ===
if ($tipo === 'getUserProfile') {
    error_log("=== OBTENIENDO PERFIL DE USUARIO ===");

    $authHeader = $_SERVER['HTTP_AUTHORIZATION'] ?? '';
    if (empty($authHeader)) {
        $authHeader = getallheaders()['Authorization'] ?? '';
    }

    $user = validateToken($conn, $authHeader);

    if (!$user) {
        sendResponse(false, "No autorizado " . json_encode($authHeader) . " " . json_encode($user));
    }

    try {
        $usuario = new Usuario($conn);
        $profileData = $usuario->obtenerPorId($user['sub']);

        if ($profileData) {
            // Obtener permisos
            $permisos = $usuario->obtenerPermisos($user['sub']);
            $profileData['permisos'] = $permisos;

            sendResponse(true, "Perfil obtenido", $profileData);
        } else {
            sendResponse(false, "Usuario no encontrado");
        }
    } catch (Exception $e) {
        error_log("Error obteniendo perfil: " . $e->getMessage());
        sendResponse(false, "Error al obtener perfil");
    }
}

// === REFRESH TOKEN ===
if ($tipo === 'refresh-token') {
    error_log("=== REFRESCANDO TOKEN ===");

    $authHeader = $_SERVER['HTTP_AUTHORIZATION'] ?? '';
    if (empty($authHeader)) {
        $authHeader = getallheaders()['Authorization'] ?? '';
    }

    $user = validateToken($conn, $authHeader);

    if (!$user) {
        sendResponse(false, "Token inválido");
    }

    try {
        // Generar nuevo token
        $auth = new Auth($conn);
        $usuario = new Usuario($conn);

        // Obtener datos actualizados del usuario
        $userData = $usuario->obtenerPorId($user['sub']);

        if ($userData) {
            $newToken = $auth->generarJWT($userData);

            // Guardar nueva sesión
            $usuario->guardarSesion(
                $userData['id'],
                hash('sha256', $newToken),
                $_SERVER['REMOTE_ADDR'] ?? 'unknown',
                $_SERVER['HTTP_USER_AGENT'] ?? 'unknown',
                date('Y-m-d H:i:s', time() + (24 * 60 * 60))
            );

            sendResponse(true, "Token refrescado", [
                'token' => $newToken,
                'expires_in' => 86400
            ]);
        } else {
            sendResponse(false, "Usuario no encontrado");
        }
    } catch (Exception $e) {
        error_log("Error refrescando token: " . $e->getMessage());
        sendResponse(false, "Error al refrescar token");
    }
}
