#pragma once

#define NUMBER_OF_ENEMY_FORMATIONS 100
#define MAX_NUMBER_OF_ENEMIES_IN_A_FORMATION 50

// Estructuras
struct enemyInits_t
{
    int x;               // Posición en el eje X donde crear al enemigo
    int y;               // Posición en el eje Y donde crear al enemigo
    float velX;          // Velocidad inicial en el eje X
    int kind;            // Tipo de enemigo
    int creationCounter; // Temporizador para la creación del enemigo
};

struct enemyFormation_t // Contiene la información de una formación enemiga
{
    int numberOfEnemies;                                     // Cantidad de enemigos que forman la formación
    enemyInits_t init[MAX_NUMBER_OF_ENEMIES_IN_A_FORMATION]; // Vector con todas las inicializaciones de los enemigos de la formación
};

struct enemyPool_t
{
    enemyFormation_t *set[10]; // Conjunto de formaciones enemigas
};

struct stage_t // Contiene todas las variables relacionadas con una fase
{
    enemyPool_t *enemyPool; // El conjunto de formaciones enemigas de la fase
    int powerToComplete;    // Cantidad de poder que se necesita para completar la fase
    int maxMenace;          // Umbral máximo de amenaza de la fase
    int minMenace;          // Umbral mínimo de amenaza de la fase
    int number;             // Número de fase
};

// Clase EnemyFormations, para gestionar las formaciones enemigas
class EnemyFormations
{
private:
    // Variables
    stage_t stage[10];                                           // Variable con los datos de cada pantalla
    enemyFormation_t enemyFormation[NUMBER_OF_ENEMY_FORMATIONS]; // Vector con todas las formaciones enemigas
    enemyPool_t enemyPool[10];                                   // Variable con los diferentes conjuntos de formaciones enemigas

    // Inicializa las formaciones enemigas
    void initEnemyFormations();

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

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

public:
    // Constructor
    EnemyFormations();

    // Destructor
    ~EnemyFormations() = default;

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