// stage_manager.hpp - Gestor de state i progressió de stages
// © 2026 JailDesigner

#pragma once

#include <cstdint>
#include <string>

#include "stage_config.hpp"
#include "wave_runner.hpp"

namespace StageSystem {

    // Estats del stage system
    enum class EstatStage : std::uint8_t {
        INIT_HUD,        // Animación inicial del HUD (3s)
        LEVEL_START,     // Pantalla "ENEMY INCOMING" (3s)
        PLAYING,         // Gameplay normal
        LEVEL_COMPLETED  // Pantalla "GOOD JOB COMMANDER!" (3s)
    };

    class StageManager {
       public:
        explicit StageManager(const StageSystemConfig* config);

        // Lifecycle
        void init();  // Reset to stage 1
        // Arranque para el mode demo (attract): carga stage_id y entra directamente
        // en PLAYING, saltando INIT_HUD y "ENEMY INCOMING" para mostrar una partida
        // ya en marcha. No reproduce game.ogg (changeState solo lo hace en LEVEL_START),
        // así la música del título sigue sonando durante el ciclo atrae.
        void initDemo(uint8_t stage_id);
        void update(float delta_time, bool pause_spawn = false);

        // Stage progression
        void markStageCompleted();                          // Call when all enemies destroyed
        [[nodiscard]] auto isGameComplete() const -> bool;  // All 10 stages done?

        // Current state queries
        [[nodiscard]] auto getState() const -> EstatStage { return estat_; }
        [[nodiscard]] auto getCurrentStage() const -> uint8_t { return stage_actual_; }
        [[nodiscard]] auto getCurrentConfig() const -> const StageConfig*;
        [[nodiscard]] auto getTransitionTimer() const -> float { return timer_transicio_; }
        [[nodiscard]] auto getLevelStartMessage() const -> const std::string& { return missatge_level_start_actual_; }

        // Wave execution (delegated)
        auto getWaveRunner() -> WaveRunner& { return wave_runner_; }
        [[nodiscard]] auto getWaveRunner() const -> const WaveRunner& { return wave_runner_; }

       private:
        const StageSystemConfig* config_;  // Non-owning pointer
        WaveRunner wave_runner_;

        EstatStage estat_{EstatStage::LEVEL_START};
        uint8_t stage_actual_{1};                  // 1-10
        float timer_transicio_{0.0F};              // Timer for LEVEL_START/LEVEL_COMPLETED (3.0s → 0.0s)
        std::string missatge_level_start_actual_;  // Missatge seleccionat per al level actual

        // State transitions
        void changeState(EstatStage nou_estat);
        void processInitHud(float delta_time);
        void processLevelStart(float delta_time);
        // Estático: solo registra log; no consulta estado del manager.
        static void processPlaying(float delta_time, bool pause_spawn);
        void processLevelCompleted(float delta_time);
        void loadStage(uint8_t stage_id);
    };

}  // namespace StageSystem
