#pragma once

#include <SDL3/SDL_rect.h>   // Para SDL_FRect
#include <SDL3/SDL_stdinc.h> // Para Uint32
#include <string>            // Para std::string
#include <vector>            // Para std::vector
#include "utils.h"           // Para Color, Zone, NotifyPosition

// --- 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
    float coffee_machine_w; // Ancho de la máquina de café
    float coffee_machine_h; // Alto de la máquina de café
    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 enter_name_seconds; // Duración en segundos para introducir el nombre al finalizar la partida
    Uint32 speed;           // Velocidad a la que transcurre el juego
};

// --- Parámetros del fade ---
struct ParamFade
{
    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"
};

// --- Parámetros del fondo ---
struct ParamBackground
{
    Color attenuate_color; // Color para atenuar el fondo
    int attenuate_alpha;   // Alpha para la atenuación
};

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

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

// --- 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
};

// --- Estructura principal para almacenar todos los parámetros del juego ---
struct Param
{
    ParamGame game;                    // Parámetros del juego
    ParamFade fade;                    // Parámetros del fade
    SDL_FRect scoreboard;              // Rectángulo del marcador
    ParamTitle title;                  // Parámetros de la pantalla de título
    ParamBackground background;        // Parámetros del fondo
    std::vector<ParamBalloon> balloon; // Parámetros de los globos
    ParamNotification notification;    // Parámetros de las notificaciones

    // Constructor
    Param() : game(), fade(), scoreboard(), title(), background(), notification()
    {
        balloon.reserve(4);
    }
};

// --- 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