#include "core/input/mouse.hpp"

namespace Mouse {
Uint32 cursor_hide_time = 3000;   // Tiempo en milisegundos para ocultar el cursor
Uint32 last_mouse_move_time = 0;  // Última vez que el ratón se movió
bool cursor_visible = true;       // Estado del cursor

// Modo forzado: Usado cuando SDLManager entra en pantalla completa.
// Cuando está activado, el cursor permanece oculto independientemente del movimiento del ratón.
// SDLManager controla esto mediante llamadas a setForceHidden().
bool force_hidden = false;

void setForceHidden(bool force) {
    force_hidden = force;

    if (force) {
        // Entrando en modo oculto forzado: ocultar cursor inmediatamente
        if (cursor_visible) {
            SDL_HideCursor();
            cursor_visible = false;
        }
    } else {
        // Saliendo de modo oculto forzado: mostrar cursor y resetear temporizador
        SDL_ShowCursor();
        cursor_visible = true;
        last_mouse_move_time = SDL_GetTicks();  // Resetear temporizador
    }
}

bool isForceHidden() {
    return force_hidden;
}

void handleEvent(const SDL_Event& event) {
    // CRÍTICO: Si estamos en modo forzado, ignorar todos los eventos del ratón
    if (force_hidden) {
        return;  // Salir temprano - no procesar ningún evento
    }

    // MODO NORMAL: Mostrar cursor al mover el ratón
    if (event.type == SDL_EVENT_MOUSE_MOTION) {
        last_mouse_move_time = SDL_GetTicks();
        if (!cursor_visible) {
            SDL_ShowCursor();
            cursor_visible = true;
        }
    }
}

void updateCursorVisibility() {
    // CRÍTICO: Si estamos en modo forzado, no aplicar lógica de timeout
    if (force_hidden) {
        return;  // Salir temprano - el cursor permanece oculto
    }

    // MODO NORMAL: Auto-ocultar basado en timeout
    Uint32 current_time = SDL_GetTicks();
    if (cursor_visible && (current_time - last_mouse_move_time > cursor_hide_time)) {
        SDL_HideCursor();
        cursor_visible = false;
    }
}
}  // namespace Mouse
