// stage_config.hpp - Estructures de dades per configuración de stages
// © 2026 JailDesigner

#pragma once

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

namespace StageSystem {

    // Tipo de mode de spawn
    enum class ModeSpawn : std::uint8_t {
        PROGRESSIVE,  // Spawn progressiu con intervals
        IMMEDIATE,    // Todos los enemigos de cop
        WAVE          // Onades de 3-5 enemigos (futura extensió)
    };

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

    // Distribució de type de enemigos (percentatges)
    struct DistribucioEnemics {
        uint8_t pentagon;   // 0-100
        uint8_t cuadrado;   // 0-100
        uint8_t molinillo;  // 0-100
                            // Suma ha de ser 100, validat en StageLoader
    };

    // Multiplicadors de dificultat
    struct MultiplicadorsDificultat {
        float velocity;           // 0.5-2.0 típic
        float rotation;           // 0.5-2.0 típic
        float tracking_strength;  // 0.0-1.5 (aplicat a Cuadrado)
    };

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

    // Configuración completa de un stage
    struct StageConfig {
        uint8_t stage_id;       // 1-10
        uint8_t total_enemies;  // 1-200 (el cap simultani en pantalla el marca MAX_ORNIS)
        ConfigSpawn config_spawn;
        DistribucioEnemics distribucio;
        MultiplicadorsDificultat multiplicadors;

        // Validació
        [[nodiscard]] auto isValid() const -> bool {
            // stage_id es uint8_t: el rango superior (<=255) está garantizado por
            // el tipo; basta con confirmar que no es 0 (sentinela "sin asignar").
            return stage_id >= 1 &&
                total_enemies > 0 && total_enemies <= 200 &&
                distribucio.pentagon + distribucio.cuadrado + distribucio.molinillo == 100;
        }
    };

    // Configuración completa del sistema (carregada desde YAML)
    struct StageSystemConfig {
        MetadataStages metadata;
        std::vector<StageConfig> stages;  // Índex [0] = stage 1

        // Obtenir configuración de un stage específic
        [[nodiscard]] auto findStage(uint8_t stage_id) const -> const StageConfig* {
            if (stage_id < 1 || stage_id > stages.size()) {
                return nullptr;
            }
            return &stages[stage_id - 1];
        }
    };

    // Constants per messages de transición
    namespace Constants {
        // Pool de messages per start 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
