#include "game/scene_manager.hpp"  // Para SceneManager

#include "core/input/global_inputs.hpp"

#include <SDL3/SDL.h>

#include <string>  // Para allocator, operator+, char_traits, string
#include <vector>  // Para vector

#include "core/input/input.hpp"       // Para Input, InputAction, INPUT_DO_NOT_ALLOW_REPEAT
#include "core/rendering/screen.hpp"  // Para Screen
#include "game/options.hpp"  // Para Options, options, OptionsVideo, Section
#include "game/ui/notifier.hpp"       // Para Notifier, NotificationText
#include "utils/utils.hpp"            // Para stringInVector

namespace GlobalInputs {
void quit() {
    const std::string CODE = SceneManager::current == SceneManager::Scene::GAME ? "PRESS AGAIN TO RETURN TO MENU" : "PRESS AGAIN TO EXIT";
    auto code_found = stringInVector(Notifier::get()->getCodes(), CODE);
    if (code_found) {
        // Si la notificación de salir está activa, cambia de sección
        SceneManager::current = SceneManager::current == SceneManager::Scene::GAME ? SceneManager::Scene::TITLE : SceneManager::Scene::QUIT;
    } else {
        // Si la notificación de salir no está activa, muestra la notificación
        Notifier::get()->show({CODE}, NotificationText::CENTER, 2000, -1, true, CODE);
    }
}

// Cambia de seccion
void skipSection() {
    switch (SceneManager::current) {
        case SceneManager::Scene::LOGO:
        case SceneManager::Scene::LOADING_SCREEN:
        case SceneManager::Scene::CREDITS:
        case SceneManager::Scene::DEMO:
        case SceneManager::Scene::GAME_OVER:
        case SceneManager::Scene::ENDING:
        case SceneManager::Scene::ENDING2:
            SceneManager::current = SceneManager::Scene::TITLE;
            SceneManager::options = SceneManager::Options::NONE;
            break;

        default:
            break;
    }
}

// Comprueba los inputs que se pueden introducir en cualquier sección del juego
void check() {
    if (Input::get()->checkInput(InputAction::EXIT, INPUT_DO_NOT_ALLOW_REPEAT)) {
        quit();
    }

    else if (Input::get()->checkInput(InputAction::ACCEPT, INPUT_DO_NOT_ALLOW_REPEAT)) {
        skipSection();
    }

    else if (Input::get()->checkInput(InputAction::TOGGLE_BORDER, INPUT_DO_NOT_ALLOW_REPEAT)) {
        Screen::get()->toggleBorder();
        Notifier::get()->show({"BORDER " + std::string(Options::video.border.enabled ? "ENABLED" : "DISABLED")}, NotificationText::CENTER);
    }

    else if (Input::get()->checkInput(InputAction::TOGGLE_VIDEOMODE, INPUT_DO_NOT_ALLOW_REPEAT)) {
        Screen::get()->toggleVideoMode();
        Notifier::get()->show({"FULLSCREEN " + std::string(static_cast<int>(Options::video.fullscreen) == 0 ? "DISABLED" : "ENABLED")}, NotificationText::CENTER);
    }

    else if (Input::get()->checkInput(InputAction::WINDOW_DEC_ZOOM, INPUT_DO_NOT_ALLOW_REPEAT)) {
        if (Screen::get()->decWindowZoom()) {
            Notifier::get()->show({"WINDOW ZOOM x" + std::to_string(Options::window.zoom)}, NotificationText::CENTER);
        }
    }

    else if (Input::get()->checkInput(InputAction::WINDOW_INC_ZOOM, INPUT_DO_NOT_ALLOW_REPEAT)) {
        if (Screen::get()->incWindowZoom()) {
            Notifier::get()->show({"WINDOW ZOOM x" + std::to_string(Options::window.zoom)}, NotificationText::CENTER);
        }
    }

    else if (Input::get()->checkInput(InputAction::TOGGLE_SHADERS, INPUT_DO_NOT_ALLOW_REPEAT)) {
        Screen::get()->toggleShaders();
        Notifier::get()->show({"SHADERS " + std::string(Options::video.shaders ? "ENABLED" : "DISABLED")}, NotificationText::CENTER);
    }

    else if (Input::get()->checkInput(InputAction::NEXT_PALETTE, INPUT_DO_NOT_ALLOW_REPEAT)) {
        Screen::get()->nextPalette();
        Notifier::get()->show({"PALETTE " + Options::video.palette}, NotificationText::CENTER);
    }

    else if (Input::get()->checkInput(InputAction::PREVIOUS_PALETTE, INPUT_DO_NOT_ALLOW_REPEAT)) {
        Screen::get()->previousPalette();
        Notifier::get()->show({"PALETTE " + Options::video.palette}, NotificationText::CENTER);
    }

    else if (Input::get()->checkInput(InputAction::TOGGLE_INTEGER_SCALE, INPUT_DO_NOT_ALLOW_REPEAT)) {
        Screen::get()->toggleIntegerScale();
        Screen::get()->setVideoMode(Options::video.fullscreen);
        Notifier::get()->show({"INTEGER SCALE " + std::string(Options::video.integer_scale ? "ENABLED" : "DISABLED")}, NotificationText::CENTER);
    }

    else if (Input::get()->checkInput(InputAction::SHOW_DEBUG_INFO, INPUT_DO_NOT_ALLOW_REPEAT)) {
        Screen::get()->toggleDebugInfo();
    }
}
}  // namespace GlobalInputs