// stage_manager.hpp - Gestor d'estat i progressió d'stages
// © 2025 Orni Attack

#pragma once

#include <cstdint>
#include <memory>

#include "spawn_controller.hpp"
#include "stage_config.hpp"

namespace StageSystem {

// Estats del stage system
enum class EstatStage {
    INIT_HUD,        // Animació 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 ConfigSistemaStages* config);

        // Lifecycle
        void inicialitzar();  // Reset to stage 1
        void actualitzar(float delta_time, bool pausar_spawn = false);

        // Stage progression
        void stage_completat();      // Call when all enemies destroyed
        [[nodiscard]] bool tot_completat() const;  // All 10 stages done?

        // Current state queries
        [[nodiscard]] EstatStage get_estat() const { return estat_; }
        [[nodiscard]] uint8_t get_stage_actual() const { return stage_actual_; }
        [[nodiscard]] const ConfigStage* get_config_actual() const;
        [[nodiscard]] float get_timer_transicio() const { return timer_transicio_; }
        [[nodiscard]] const std::string& get_missatge_level_start() const { return missatge_level_start_actual_; }

        // Spawn control (delegate to SpawnController)
        SpawnController& get_spawn_controller() { return spawn_controller_; }
        [[nodiscard]] const SpawnController& get_spawn_controller() const { return spawn_controller_; }

    private:
        const ConfigSistemaStages* config_;  // Non-owning pointer
        SpawnController spawn_controller_;

        EstatStage estat_;
        uint8_t stage_actual_;                     // 1-10
        float timer_transicio_;                    // 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 canviar_estat(EstatStage nou_estat);
        void processar_init_hud(float delta_time);
        void processar_level_start(float delta_time);
        void processar_playing(float delta_time, bool pausar_spawn);
        void processar_level_completed(float delta_time);
        void carregar_stage(uint8_t stage_id);
};

}  // namespace StageSystem
