// spawn_controller.hpp - Controlador de spawn d'enemics
// © 2025 Orni Attack

#pragma once

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

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

namespace StageSystem {

// Informació de spawn planificat
struct SpawnEvent {
        float temps_spawn;  // Temps absolut (segons) per spawnejar
        TipusEnemic tipus;  // Tipus d'enemic
        bool spawnejat;     // Ja s'ha processat?
};

class SpawnController {
    public:
        SpawnController();

        // Configuration
        void configurar(const ConfigStage* config);  // Set stage config
        void iniciar();                              // Generate spawn schedule
        void reset();                                // Clear all pending spawns

        // Update
        void actualitzar(float delta_time, std::array<Enemic, 15>& orni_array, bool pausar = false);

        // Status queries
        bool tots_enemics_spawnejats() const;
        bool tots_enemics_destruits(const std::array<Enemic, 15>& orni_array) const;
        uint8_t get_enemics_vius(const std::array<Enemic, 15>& orni_array) const;
        uint8_t get_enemics_spawnejats() const;

        // [NEW] Set ship position reference for safe spawn
        void set_ship_position(const Punt* ship_pos) { ship_position_ = ship_pos; }

    private:
        const ConfigStage* config_;  // Non-owning pointer to current stage config
        std::vector<SpawnEvent> spawn_queue_;
        float temps_transcorregut_;   // Elapsed time since stage start
        uint8_t index_spawn_actual_;  // Next spawn to process

        // Spawn generation
        void generar_spawn_events();
        TipusEnemic seleccionar_tipus_aleatori() const;
        void spawn_enemic(Enemic& enemic, TipusEnemic tipus, const Punt* ship_pos = nullptr);
        void aplicar_multiplicadors(Enemic& enemic) const;
        const Punt* ship_position_;  // [NEW] Non-owning pointer to ship position
};

}  // namespace StageSystem
