#pragma once

#include "balloon.h"

constexpr int NUMBER_OF_BALLOON_FORMATIONS = 100;
constexpr int MAX_NUMBER_OF_BALLOONS_IN_A_FORMATION = 50;
constexpr int NUMBER_OF_SETS_PER_POOL = 10;
constexpr int NUMBER_OF_STAGES = 10;

// Estructuras
struct BalloonFormationParams
{
    int x = 0;                               // Posición en el eje X donde crear el globo
    int y = 0;                               // Posición en el eje Y donde crear el globo
    float vel_x = 0.0f;                      // Velocidad inicial en el eje X
    BalloonType type = BalloonType::BALLOON; // Tipo de globo
    BalloonSize size = BalloonSize::SIZE1;   // Tamaño de globo
    int creation_counter = 0;                // Temporizador para la creación del globo

    // Constructor por defecto
    BalloonFormationParams() = default;

    // Constructor con parámetros
    BalloonFormationParams(int x_val, int y_val, float vel_x_val, BalloonType type_val, BalloonSize size_val, int creation_counter_val)
        : x(x_val), y(y_val), vel_x(vel_x_val), type(type_val), size(size_val), creation_counter(creation_counter_val) {}
};

struct BalloonFormationUnit // Contiene la información de una formación enemiga
{
    int number_of_balloons;                                             // Cantidad de globos que forman la formación
    BalloonFormationParams init[MAX_NUMBER_OF_BALLOONS_IN_A_FORMATION]; // Vector con todas las inicializaciones de los globos de la formación
};

struct BalloonFormationPool
{
    BalloonFormationUnit set[NUMBER_OF_SETS_PER_POOL]; // Conjunto de formaciones de globos
};

struct Stage // Contiene todas las variables relacionadas con una fase
{
    BalloonFormationPool balloon_pool; // El conjunto de formaciones de globos de la fase
    int power_to_complete;             // Cantidad de poder que se necesita para completar la fase
    int max_menace;                    // Umbral máximo de amenaza de la fase
    int min_menace;                    // Umbral mínimo de amenaza de la fase
    int number;                        // Número de fase
};

// Clase BalloonFormations, para gestionar las formaciones de globos
class BalloonFormations
{
private:
    // Variables
    Stage stage_[NUMBER_OF_STAGES];                                        // Variable con los datos de cada pantalla
    BalloonFormationUnit balloon_formation_[NUMBER_OF_BALLOON_FORMATIONS]; // Vector con todas las formaciones enemigas
    BalloonFormationPool balloon_formation_pool_[NUMBER_OF_STAGES];        // Variable con los diferentes conjuntos de formaciones enemigas

    // Inicializa las formaciones enemigas
    void initBalloonFormations();

    // Inicializa los conjuntos de formaciones
    void initBalloonFormationPools();

    // Inicializa las fases del juego
    void initGameStages();

public:
    // Constructor
    BalloonFormations();

    // Destructor
    ~BalloonFormations() = default;

    // Devuelve una fase
    Stage getStage(int index) const;
};