#include "core/system/global_events.hpp"

#include "core/input/input.hpp"  // Para Input (gamepad add/remove)
#include "core/input/mouse.hpp"
#include "core/locale/locale.hpp"  // Para Locale
#include "game/options.hpp"        // Para Options, options, OptionsGame, OptionsAudio
#include "game/scene_manager.hpp"  // Para SceneManager
#include "game/ui/console.hpp"     // Para Console
#include "game/ui/notifier.hpp"    // Para Notifier

namespace GlobalEvents {
    // Comprueba los eventos que se pueden producir en cualquier sección del juego
    void handle(const SDL_Event& event) {
#ifndef __EMSCRIPTEN__
        // En la versión web no tenemos evento de quit del navegador
        if (event.type == SDL_EVENT_QUIT) {
            SceneManager::current = SceneManager::Scene::QUIT;
            return;
        }
#endif

        if (event.type == SDL_EVENT_RENDER_DEVICE_RESET || event.type == SDL_EVENT_RENDER_TARGETS_RESET) {
            // reLoadTextures();
        }

        // Conexión/desconexión de gamepads: hay que enrutarlos a Input para que
        // añada el dispositivo a gamepads_. Sin esto, en wasm los gamepads
        // nunca se detectan (la Gamepad API del navegador sólo los expone
        // tras que el usuario los active, más tarde que el discoverGamepads
        // inicial). En desktop también arregla la conexión en caliente.
        if (event.type == SDL_EVENT_GAMEPAD_ADDED || event.type == SDL_EVENT_GAMEPAD_REMOVED) {
            if (Input::get() != nullptr) {
                std::string name = Input::get()->handleEvent(event);
                if (!name.empty() && Notifier::get() != nullptr && Locale::get() != nullptr) {
                    const std::string KEY = (event.type == SDL_EVENT_GAMEPAD_ADDED)
                        ? "ui.gamepad_connected"
                        : "ui.gamepad_disconnected";
                    Notifier::get()->show({name + " " + Locale::get()->get(KEY)});
                }
            }
        }

        // Enrutar eventos de texto a la consola cuando está activa
        if (Console::get() != nullptr && Console::get()->isActive()) {
            if (event.type == SDL_EVENT_TEXT_INPUT || event.type == SDL_EVENT_KEY_DOWN) {
                Console::get()->handleEvent(event);
                return;
            }
        }

        Mouse::handleEvent(event);
    }
}  // namespace GlobalEvents