#pragma once

#include <SDL3/SDL.h>  // Para SDL_Scancode

#include <string>

namespace Options {

// Estructures de configuració

struct Window {
        int width{640};
        int height{480};
        bool fullscreen{false};
        float zoom_factor{1.0F};  // Zoom level (0.5x to max_zoom)
};

struct Physics {
        float rotation_speed{3.14F};  // rad/s
        float acceleration{400.0F};   // px/s²
        float max_velocity{120.0F};   // px/s
        float friction{20.0F};        // px/s²
        float enemy_speed{2.0F};      // unitats/frame
        float bullet_speed{6.0F};     // unitats/frame
};

struct Gameplay {
        int max_enemies{15};
        int max_bullets{3};
};

struct Rendering {
        int vsync{1};  // 0=disabled, 1=enabled
};

struct Music {
        bool enabled{true};
        float volume{0.8F};
};

struct Sound {
        bool enabled{true};
        float volume{1.0F};
};

struct Audio {
        Music music{};
        Sound sound{};
        bool enabled{true};
        float volume{1.0F};
};

// Controles de jugadors

struct KeyboardControls {
        SDL_Scancode key_left{SDL_SCANCODE_LEFT};
        SDL_Scancode key_right{SDL_SCANCODE_RIGHT};
        SDL_Scancode key_thrust{SDL_SCANCODE_UP};
        SDL_Scancode key_shoot{SDL_SCANCODE_SPACE};
        SDL_Scancode key_start{SDL_SCANCODE_1};
};

struct GamepadControls {
        int button_left{SDL_GAMEPAD_BUTTON_DPAD_LEFT};
        int button_right{SDL_GAMEPAD_BUTTON_DPAD_RIGHT};
        int button_thrust{SDL_GAMEPAD_BUTTON_WEST};  // X button
        int button_shoot{SDL_GAMEPAD_BUTTON_SOUTH};  // A button
};

struct PlayerControls {
        KeyboardControls keyboard{};
        GamepadControls gamepad{};
        std::string gamepad_name;  // Buit = auto-assignar per índex
};

// Variables globals (inline per evitar ODR violations)

inline std::string version{};  // Versió del config per validació
inline bool console{false};    // Eixida de debug
inline Window window{};
inline Physics physics{};
inline Gameplay gameplay{};
inline Rendering rendering{};
inline Audio audio{};

// Controles per jugador
inline PlayerControls player1{
    .keyboard =
        {.key_left = SDL_SCANCODE_LEFT,
            .key_right = SDL_SCANCODE_RIGHT,
            .key_thrust = SDL_SCANCODE_UP,
            .key_shoot = SDL_SCANCODE_SPACE,
            .key_start = SDL_SCANCODE_1},
    .gamepad_name = ""  // Primer gamepad disponible
};

inline PlayerControls player2{
    .keyboard =
        {.key_left = SDL_SCANCODE_A,
            .key_right = SDL_SCANCODE_D,
            .key_thrust = SDL_SCANCODE_W,
            .key_shoot = SDL_SCANCODE_LSHIFT,
            .key_start = SDL_SCANCODE_2},
    .gamepad_name = ""  // Segon gamepad disponible
};

// Per compatibilitat amb pollo (no utilitzat en orni, però necessari per Input)
inline KeyboardControls keyboard_controls{};
inline GamepadControls gamepad_controls{};

inline std::string config_file_path{};  // Establert per setConfigFile()

// Funcions públiques

void init();  // Inicialitzar amb valors per defecte
void setConfigFile(
    const std::string& path);  // Establir ruta del fitxer de config
auto loadFromFile() -> bool;   // Carregar config YAML
auto saveToFile() -> bool;     // Guardar config YAML

}  // namespace Options
