// global_events.cpp - Implementació dels events globals
// © 2025 Port a C++20

#include "global_events.hpp"

#include <iostream>

#include "context_escenes.hpp"
#include "core/input/input.hpp"
#include "core/input/mouse.hpp"
#include "core/rendering/sdl_manager.hpp"

// Using declarations per simplificar el codi
using GestorEscenes::ContextEscenes;
using Escena = ContextEscenes::Escena;

namespace GlobalEvents {

bool handle(const SDL_Event& event, SDLManager& sdl, ContextEscenes& context) {
    // 1. Permitir que Input procese el evento (para hotplug de gamepads)
    auto event_msg = Input::get()->handleEvent(event);
    if (!event_msg.empty()) {
        std::cout << "[Input] " << event_msg << std::endl;
    }

    // 2. Procesar SDL_EVENT_QUIT directamente (no es input de juego)
    if (event.type == SDL_EVENT_QUIT) {
        context.canviar_escena(Escena::EIXIR);
        GestorEscenes::actual = Escena::EIXIR;
        return true;
    }

    // 3. Gestió del ratolí (auto-ocultar)
    Mouse::handleEvent(event);

    // 4. Procesar acciones globales directamente desde eventos SDL
    // (NO usar Input::checkAction() para evitar desfase de timing)
    if (event.type == SDL_EVENT_KEY_DOWN) {
        switch (event.key.scancode) {
            case SDL_SCANCODE_F1:
                sdl.decreaseWindowSize();
                return true;

            case SDL_SCANCODE_F2:
                sdl.increaseWindowSize();
                return true;

            case SDL_SCANCODE_F3:
                sdl.toggleFullscreen();
                return true;

            case SDL_SCANCODE_F4:
                sdl.toggleVSync();
                return true;

            case SDL_SCANCODE_ESCAPE:
                context.canviar_escena(Escena::EIXIR);
                GestorEscenes::actual = Escena::EIXIR;
                return true;

            default:
                // Tecla no global
                break;
        }
    }

    return false;  // Event no processat
}

}  // namespace GlobalEvents
