#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 = 2;  // 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 = "zx-spectrum";         // 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 defectoF
}  // 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 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 Defaults::Sound

namespace Defaults::Cheat {
    constexpr bool INFINITE_LIVES = false;  // Vidas infinitas desactivadas por defecto
    constexpr bool INVINCIBLE = false;      // Invencibilidad desactivada por defecto
    constexpr bool JAIL_IS_OPEN = false;    // Jail abierta 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
    constexpr const char* WORST_NIGHTMARE = "";  // Habitación con más muertes 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_UP;      // 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
}  // 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::Localization {
    constexpr const char* LANGUAGE = "ca";  // Idioma por defecto (en = inglés, ca = catalán)
}  // namespace Defaults::Localization

namespace Defaults::Loading {
    constexpr bool SHOW = false;               // No mostrar la pantalla de carga por defecto
    constexpr bool SHOW_RESOURCE_NAME = true;  // Mostrar el nombre del recurso por defecto
    constexpr bool WAIT_FOR_INPUT = false;     // No esperar tecla al terminar por defecto
}  // namespace Defaults::Loading

namespace Defaults::Game::Items {
    constexpr const float PERCENT_TO_OPEN_THE_JAIL = 0.9F;  // Porcentaje de items necesarios para abrir la jail
}  // namespace Defaults::Game::Items

namespace Defaults::Game::Room {
    constexpr const char* INITIAL = "03.yaml";  // Habitación de inicio
    constexpr const char* END_ROOM = "01";      // Habitación final (jail)
}  // 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 int COLOR = -1;                        // Color del jugador (-1 = automático según cheats)
}  // namespace Defaults::Game::Player
