// stage_config.hpp - Estructures de dades per configuració d'stages
// © 2025 Orni Attack

#pragma once

#include <array>
#include <cstdint>
#include <string>
#include <vector>

namespace StageSystem {

// Tipus de mode de spawn
enum class ModeSpawn {
    PROGRESSIVE,  // Spawn progressiu amb intervals
    IMMEDIATE,    // Tots els enemics de cop
    WAVE          // Onades de 3-5 enemics (futura extensió)
};

// Configuració de spawn
struct ConfigSpawn {
        ModeSpawn mode;
        float delay_inicial;   // Segons abans del primer spawn
        float interval_spawn;  // Segons entre spawns consecutius
};

// Distribució de tipus d'enemics (percentatges)
struct DistribucioEnemics {
        uint8_t pentagon;   // 0-100
        uint8_t quadrat;    // 0-100
        uint8_t molinillo;  // 0-100
                            // Suma ha de ser 100, validat en StageLoader
};

// Multiplicadors de dificultat
struct MultiplicadorsDificultat {
        float velocitat;          // 0.5-2.0 típic
        float rotacio;            // 0.5-2.0 típic
        float tracking_strength;  // 0.0-1.5 (aplicat a Quadrat)
};

// Metadades del fitxer YAML
struct MetadataStages {
        std::string version;
        uint8_t total_stages;
        std::string descripcio;
};

// Configuració completa d'un stage
struct ConfigStage {
        uint8_t stage_id;       // 1-10
        uint8_t total_enemics;  // 5-15
        ConfigSpawn config_spawn;
        DistribucioEnemics distribucio;
        MultiplicadorsDificultat multiplicadors;

        // Validació
        [[nodiscard]] bool es_valid() const {
            return stage_id >= 1 && stage_id <= 255 &&
                total_enemics > 0 && total_enemics <= 15 &&
                distribucio.pentagon + distribucio.quadrat + distribucio.molinillo == 100;
        }
};

// Configuració completa del sistema (carregada des de YAML)
struct ConfigSistemaStages {
        MetadataStages metadata;
        std::vector<ConfigStage> stages;  // Índex [0] = stage 1

        // Obtenir configuració d'un stage específic
        [[nodiscard]] const ConfigStage* obte_stage(uint8_t stage_id) const {
            if (stage_id < 1 || stage_id > stages.size()) {
                return nullptr;
            }
            return &stages[stage_id - 1];
        }
};

// Constants per missatges de transició
namespace Constants {
// Pool de missatges per inici de level (selecció aleatòria)
inline constexpr std::array<const char*, 12> MISSATGES_LEVEL_START = {
    "ORNI ALERT!",
    "INCOMING ORNIS!",
    "ROLLING THREAT!",
    "ENEMY WAVE!",
    "WAVE OF ORNIS DETECTED!",
    "NEXT SWARM APPROACHING!",
    "BRACE FOR THE NEXT WAVE!",
    "ANOTHER ATTACK INCOMING!",
    "SENSORS DETECT HOSTILE ORNIS...",
    "UNIDENTIFIED ROLLING OBJECTS INBOUND!",
    "ENEMY FORCES MOBILIZING!",
    "PREPARE FOR IMPACT!"};

constexpr const char* MISSATGE_LEVEL_COMPLETED = "GOOD JOB COMMANDER!";
}  // namespace Constants

}  // namespace StageSystem
