#pragma once

#include <SDL2/SDL_rect.h> // Para SDL_Rect
#include <string>          // Para string
#include <vector>          // Para vector
#include "utils.h"         // Para Color, Zone

// param.game
struct ParamGame
{
    int width;              // Ancho de la resolucion nativa del juego
    int height;             // Alto de la resolucion nativa del juego
    int item_size;          // Tamaño de los items del juego
    Zone play_area;         // Rectangulo con la posición de la zona de juego
    Zone game_area;         // Rectangulo con las dimensiones del juego
    int enter_name_seconds; // Duración en segundos para introducir el nombre al finalizar la partida
};

// param.fade
struct ParamFade
{
    int num_squares_width;    // Cantidad total de cuadraditos en horizontal para el FadeType::RANDOM_SQUARE
    int 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 pintaran cada vez
    int post_duration;        // Duración final del fade
    int venetian_size;        // Altura de los rectangulos para FadeType::VENETIAN
};

// param.title
struct ParamTitle
{
    int press_start_position;    // Posición del texto para empezar a jugar
    int title_duration;          // Tiempo de inactividad del titulo
    int arcade_edition_position; // Posición del bitmap
    int title_c_c_position;      // Posición del bitmap
};

// param.background
struct ParamBackground
{
    Color attenuate_color;
    int attenuate_alpha;
};

struct ParamBalloon
{
    float grav; // Aceleración en el eje Y. Modifica la velocidad
    float vel;  // Velocidad inicial que tienen al rebotar contra el suelo

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

// Estructura para las opciones de las notificaciones
struct ParamNotification
{
    NotifyPosition pos_h; // Ubicación de las notificaciones en pantalla
    NotifyPosition pos_v; // Ubicación de las notificaciones en pantalla
    bool sound;           // Indica si las notificaciones suenan
    Color color;          // Color de las notificaciones
};

// Estructura para almacenar todos los parámetros del juego
struct Param {
    ParamGame game;
    ParamFade fade;
    SDL_Rect scoreboard;
    ParamTitle title;
    ParamBackground background;
    std::vector<ParamBalloon> balloon;
    ParamNotification notification;

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

extern Param param;


extern Param param;

// Establece valores para los parametros a partir de un fichero de texto
void loadParamsFromFile(const std::string &file_path);