#pragma once

#include <SDL3/SDL.h>  // Para Uint32, SDL_FRect

#include <array>   // Para array
#include <string>  // Para basic_string, string

#include "color.h"  // Para Color, NotifyPosition (ptr only), Zone
#include "utils.h"

// --- Parámetros del juego ---
struct ParamGame {
        float width;                // Ancho de la resolución nativa del juego
        float height;               // Alto de la resolución nativa del juego
        float item_size;            // Tamaño de los ítems del juego
        Zone play_area;             // Rectángulo con la posición de la zona de juego
        Zone game_area;             // Rectángulo con las dimensiones del juego
        int name_entry_idle_time;   // Segundos para introducir el nombre al finalizar la partida si no se pulsa nada
        int name_entry_total_time;  // Segundos totales para introducir el nombre al finalizar la partida
        Uint32 speed;               // Velocidad a la que transcurre el juego
        bool hit_stop;              // Indica si debe haber un paro cuando el jugador es golpeado por un globo
        Uint32 hit_stop_ms;         // Cantidad de milisegundos que dura el hit_stop
};

// --- Parámetros del fade ---
struct ParamFade {
        Color color;               // Color del fade
        float num_squares_width;   // Cantidad total de cuadraditos en horizontal para el FadeType::RANDOM_SQUARE
        float num_squares_height;  // Cantidad total de cuadraditos en vertical para el FadeType::RANDOM_SQUARE
        int random_squares_delay;  // Duración entre cada pintado de cuadrados
        int random_squares_mult;   // Cantidad de cuadrados que se pintarán cada vez
        int post_duration;         // Duración final del fade
        float venetian_size;       // Altura de los rectángulos para FadeType::VENETIAN
};

// --- Parámetros de la pantalla de título ---
struct ParamTitle {
        int press_start_position;     // Posición del texto para empezar a jugar
        int title_duration;           // Tiempo de inactividad del título
        int arcade_edition_position;  // Posición del bitmap "Arcade Edition"
        int title_c_c_position;       // Posición del bitmap "Coffee Crisis"
        Color bg_color;               // Color para los tiles de fondo
};

// --- Parámetros del fondo ---
struct ParamBackground {
        Color attenuate_color;  // Color para atenuar el fondo
};

// --- Parámetros de los globos ---
struct ParamBalloon {
        struct Settings {
                float grav;  // Aceleración en el eje Y. Modifica la velocidad
                float vel;   // Velocidad inicial al rebotar contra el suelo

                // Constructor
                explicit Settings(float grav_val = 0.0F, float vel_val = 0.0F)
                    : grav(grav_val), vel(vel_val) {}
        };

        std::array<Settings, 4> settings;
        std::array<std::string, 4> color;
        bool bouncing_sound;  // Indica si los globos hacer sonido al rebotar
};

// --- Parámetros de las notificaciones ---
struct ParamNotification {
        NotifyPosition pos_h;  // Ubicación horizontal de las notificaciones en pantalla
        NotifyPosition pos_v;  // Ubicación vertical de las notificaciones en pantalla
        bool sound;            // Indica si las notificaciones suenan
        Color color;           // Color de las notificaciones
};

// --- Parámetros del marcador ---
struct ParamScoreboard {
        SDL_FRect rect;            // Posición y tamaño del marcador
        bool separator_autocolor;  // El separado establece su color de forma automatica
        Color separator_color;     // Color del separador si se pone de forma manual
        Color easy_color;          // Color del marcador segun la dificultad
        Color normal_color;        // Color del marcador segun la dificultad
        Color hard_color;          // Color del marcador segun la dificultad
        bool text_autocolor;       // El texto establece su color de forma automatica
        Color text_color1;         // Color del texto
        Color text_color2;         // Color del texto
        int skip_countdown_value;  // Valor a partir del cual se puede saltar la cuenta atras
};

// --- Parámetros del menú de servicio ---
struct ParamServiceMenu {
        Color title_color;
        Color text_color;
        Color selected_color;
        Color bg_color;
        bool drop_shadow;
};

// --- Parámetros de la intro ---
struct ParamIntro {
        Color bg_color;
        Color card_color;
        Color shadow_color;
        int text_distance_from_bottom;
};

// --- Parámetros para Debug ---
struct ParamDebug {
        Color color;
};

// --- Parámetros para Resource ---
struct ParamResource {
        Color color;
};

// --- Estructura principal para almacenar todos los parámetros del juego ---
struct Param {
        ParamGame game;                  // Parámetros del juego
        ParamFade fade;                  // Parámetros del fade
        ParamScoreboard scoreboard;      // Rectángulo del marcador
        ParamTitle title;                // Parámetros de la pantalla de título
        ParamBackground background;      // Parámetros del fondo
        ParamBalloon balloon;            // Parámetros de los globos
        ParamNotification notification;  // Parámetros de las notificaciones
        ParamServiceMenu service_menu;   // Parámetros del menú de servicio
        ParamIntro intro;                // Parámetros de la intro
        ParamDebug debug;                // Parámetros para Debug
        ParamResource resource;          // Parámetros para Resource

        // Constructor
        Param()
            : game(), fade(), scoreboard(), title(), background(), balloon(), notification(), service_menu(), intro(), debug(), resource() {}
};

// --- Variable global con los parámetros del juego ---
extern Param param;

// --- Funciones globales ---
void loadParamsFromFile(const std::string &file_path);  // Establece valores para los parámetros a partir de un fichero de texto