#pragma once

#include <SDL3/SDL.h>

#include "core/rendering/screen.hpp"  // Para Screen::Filter
#include "utils/defines.hpp"          // Para GameCanvas
#include "utils/utils.hpp"            // Para PaletteColor

// Forward declarations from Options namespace
namespace Options {
    // enum class ControlScheme;
    enum class NotificationPosition;
}  // namespace Options

namespace Defaults::Canvas {
    constexpr int WIDTH = GameCanvas::WIDTH;    // Ancho del canvas del juego (256)
    constexpr int HEIGHT = GameCanvas::HEIGHT;  // Alto del canvas del juego (192)
}  // namespace Defaults::Canvas

namespace Defaults::Window {
    constexpr int ZOOM = 3;  // Zoom de la ventana por defecto
}  // namespace Defaults::Window

namespace Defaults::Video {
    constexpr bool FULLSCREEN = false;                          // Modo de pantalla completa por defecto (false = ventana)
    constexpr Screen::Filter FILTER = Screen::Filter::NEAREST;  // Filtro por defecto
    constexpr bool VERTICAL_SYNC = true;                        // Vsync activado por defecto
    constexpr bool SHADER_ENABLED = false;                      // Shaders de post-procesado desactivados por defecto
    constexpr bool INTEGER_SCALE = true;                        // Escalado entero activado por defecto
    constexpr bool KEEP_ASPECT = true;                          // Mantener aspecto activado por defecto
    constexpr const char* PALETTE_NAME = "resurrect-64";        // Paleta por defecto
    constexpr const char* PALETTE_SORT = "original";            // Modo de ordenación de paleta por defecto
    constexpr bool GPU_ACCELERATION = true;                     // Aceleración GPU activada por defecto
}  // namespace Defaults::Video

namespace Defaults::Border {
    constexpr bool ENABLED = true;  // Borde activado por defecto
    constexpr int WIDTH = 32;       // Ancho del borde por defecto
    constexpr int HEIGHT = 24;      // Alto del borde por defecto
}  // namespace Defaults::Border

namespace Defaults::Audio {
    constexpr float VOLUME = 1.0F;  // Volumen por defecto
    constexpr bool ENABLED = true;  // Audio por defecto
}  // namespace Defaults::Audio

namespace Defaults::Music {
    constexpr float VOLUME = 0.8F;  // Volumen por defecto de la musica
    constexpr bool ENABLED = true;  // Musica habilitada por defecto

    namespace Files {
        constexpr const char* TITLE_TRACK = "574071_EA_DTV.ogg";
        constexpr const char* GAME_TRACK = "574070_KUVO_Farewell_to_school.ogg";
    }  // namespace Files
}  // namespace Defaults::Music

namespace Defaults::Sound {
    constexpr float VOLUME = 1.0F;  // Volumen por defecto de los efectos de sonido
    constexpr bool ENABLED = true;  // Sonido habilitado por defecto

    namespace Files {
        constexpr const char* JUMP = "jump.wav";
        constexpr const char* LAND = "land.wav";
        constexpr const char* DEATH = "death.wav";
        constexpr const char* ITEM = "item.wav";
        constexpr const char* NOTIFY = "notify.wav";
    }  // namespace Files
}  // namespace Defaults::Sound

namespace Defaults::Cheat {
    constexpr bool INFINITE_LIVES = false;  // Vidas infinitas desactivadas por defecto
    constexpr bool INVINCIBLE = false;      // Invencibilidad desactivada por defecto
}  // namespace Defaults::Cheat

namespace Defaults::Stats {
    constexpr int ROOMS = 0;  // Habitaciones visitadas por defecto
    constexpr int ITEMS = 0;  // Items obtenidos por defecto
}  // namespace Defaults::Stats

namespace Defaults::Controls {
    constexpr SDL_Scancode KEY_LEFT = SDL_SCANCODE_LEFT;    // Tecla izquierda por defecto
    constexpr SDL_Scancode KEY_RIGHT = SDL_SCANCODE_RIGHT;  // Tecla derecha por defecto
    constexpr SDL_Scancode KEY_JUMP = SDL_SCANCODE_Z;       // Tecla salto por defecto

    constexpr int GAMEPAD_BUTTON_LEFT = SDL_GAMEPAD_BUTTON_DPAD_LEFT;    // Botón izquierda por defecto
    constexpr int GAMEPAD_BUTTON_RIGHT = SDL_GAMEPAD_BUTTON_DPAD_RIGHT;  // Botón derecha por defecto
    constexpr int GAMEPAD_BUTTON_JUMP = SDL_GAMEPAD_BUTTON_WEST;         // Botón salto por defecto
    constexpr Sint16 JOYSTICK_AXIS_THRESHOLD = 20000;                    // Umbral para ejes y triggers del gamepad
}  // namespace Defaults::Controls

namespace Defaults::Kiosk {
    constexpr bool ENABLED = false;             // Modo kiosko desactivado por defecto
    constexpr const char* TEXT = "KIOSK MODE";  // Texto del modo kiosko por defecto
    constexpr bool INFINITE_LIVES = true;       // Vidas infinitas en modo kiosko desactivadas por defecto
}  // namespace Defaults::Kiosk

namespace Defaults::Notification {
    constexpr Uint8 BG_COLOR = 0;              // Color de fondo (DEFAULT) — púrpura oscuro
    constexpr Uint8 BORDER_COLOR = 7;          // Color del borde (DEFAULT) — gris azulado
    constexpr Uint8 TEXT_COLOR = 7;            // Color del texto (DEFAULT) — gris azulado
    constexpr Uint8 CHEEVO_BG_COLOR = 0;       // Color de fondo (CHEEVO) — púrpura oscuro
    constexpr Uint8 CHEEVO_BORDER_COLOR = 18;  // Color del borde (CHEEVO) — amarillo dorado
    constexpr Uint8 CHEEVO_TEXT_COLOR = 9;     // Color del texto (CHEEVO) — blanco
}  // namespace Defaults::Notification

namespace Defaults::Console {
    constexpr bool TRANSPARENT = false;  // Por defecto sólida
    constexpr Uint8 BG_COLOR = 0;        // Color de fondo (índice de paleta)
    constexpr Uint8 MSG_COLOR = 8;       // Color de los mensajes
    constexpr Uint8 PROMPT_COLOR = 9;    // Color del prompt y del borde
    constexpr Uint8 COMMAND_COLOR = 9;   // Color del texto que escribe el usuario
}  // namespace Defaults::Console

namespace Defaults::Loading {
    constexpr bool SHOW_PROGRESS = false;  // Por defecto no mostrar la barra de carga de recursos
}  // namespace Defaults::Loading

namespace Defaults::Localization {
    constexpr const char* LANGUAGE = "ca";  // Idioma por defecto (en = inglés, ca = catalán)
}  // namespace Defaults::Localization

namespace Defaults::Game::Room {
    constexpr const char* INITIAL = "001.yaml";  // Habitación de inicio
}  // namespace Defaults::Game::Room

namespace Defaults::Game::Player {
    constexpr int SPAWN_X = 25 * Tile::SIZE;                  // Posición X inicial
    constexpr int SPAWN_Y = 13 * Tile::SIZE;                  // Posición Y inicial
    constexpr SDL_FlipMode SPAWN_FLIP = Flip::LEFT;           // Orientación inicial
    constexpr const char* SKIN = "default";                   // Skin del jugador por defecto
    constexpr const char* DEFAULT_ANIMATION = "player.yaml";  // Animación del skin por defecto
}  // namespace Defaults::Game::Player
