// wave_runner.hpp - Executor d'onades per a un stage
// © 2026 JailDesigner

#pragma once

#include <array>
#include <cstdint>

#include "core/types.hpp"
#include "game/entities/enemy.hpp"
#include "stage_config.hpp"

namespace StageSystem {

    // Estat intern de la wave actual: quants spawns ja emesos i temps elapsed.
    // Una sola wave "viva" alhora a nivell d'emissió, però els enemics
    // d'onades anteriors compten per al `all_dead` (model "arena": tot el que
    // hi ha viu compta).
    class WaveRunner {
       public:
        WaveRunner() = default;

        void configure(const StageConfig* config);
        void start();
        void reset();

        // Update per frame. orni_array és l'arena real (max 15 simultanis).
        void update(float delta_time, std::array<Enemy, 15>& orni_array, bool pausar = false);

        // Stage acabat: totes les waves emeses i arena buida.
        [[nodiscard]] auto stageComplete(const std::array<Enemy, 15>& orni_array) const -> bool;

        void setShipPosition(const Vec2* ship_pos) { ship_position_ = ship_pos; }

        // Comptatge d'enemics vius (utilitat compartida; estàtica per no acoblar).
        [[nodiscard]] static auto getAliveEnemyCount(const std::array<Enemy, 15>& orni_array) -> uint8_t;

       private:
        const StageConfig* config_{nullptr};
        const Vec2* ship_position_{nullptr};

        uint8_t wave_index_{0};          // Índex de la wave actual dins config_->waves
        float wave_elapsed_{0.0F};       // Segons des de l'inici de la wave actual
        uint8_t spawns_emitted_{0};      // Spawns ja col·locats a l'arena d'aquesta wave
        bool all_waves_emitted_{false};  // Ja no queden waves per emetre

        [[nodiscard]] auto currentWave() const -> const WaveConfig*;
        void emitPendingSpawns(std::array<Enemy, 15>& orni_array);
        void spawnEnemy(Enemy& enemy, EnemyType type);
        void applyMultipliers(Enemy& enemy) const;
        [[nodiscard]] auto shouldAdvance(const std::array<Enemy, 15>& orni_array) const -> bool;
        void advanceWave();
    };

}  // namespace StageSystem
