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

#pragma once

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

#include "game/entities/enemy.hpp"

namespace StageSystem {

    // Multiplicadors de dificultat aplicats a tots els enemics del stage.
    struct MultiplicadorsDificultat {
        float velocity{1.0F};
        float rotation{1.0F};
        float tracking_strength{0.0F};
    };

    // Condició de transició a la següent onada.
    // Pot ser una OR de "tots morts" i "timeout"; en falta tots dos cas, la
    // wave no avança mai (invàlid: validat al loader).
    struct WaveNext {
        bool on_all_dead{false};
        bool has_timeout{false};
        float timeout{0.0F};

        [[nodiscard]] auto isValid() const -> bool {
            return on_all_dead || has_timeout;
        }
    };

    // Una onada: llista d'enemics a spawnejar i regla per passar a la següent.
    struct WaveConfig {
        std::vector<EnemyType> spawn;  // Ordre i tipus dels spawns
        float spawn_interval{0.0F};    // Segons entre spawns interns (0 = simultanis)
        WaveNext next;
    };

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

    // Configuració completa d'un stage
    struct StageConfig {
        uint8_t stage_id{0};
        MultiplicadorsDificultat multiplicadors;
        std::vector<WaveConfig> waves;

        [[nodiscard]] auto isValid() const -> bool {
            if (stage_id == 0 || waves.empty()) {
                return false;
            }
            for (const auto& w : waves) {
                if (!w.next.isValid() || w.spawn.empty()) {
                    return false;
                }
            }
            return true;
        }
    };

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

        [[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];
        }
    };

}  // namespace StageSystem
