// debris_manager.hpp - Gestor de fragments d'explosions
// © 2025 Port a C++20 amb SDL3

#pragma once
#include <SDL3/SDL.h>

#include <array>
#include <memory>

#include "core/graphics/shape.hpp"
#include "core/types.hpp"
#include "debris.hpp"

namespace Effects {

// Gestor de fragments d'explosions
// Manté un pool d'objectes Debris i gestiona el seu cicle de vida
class DebrisManager {
    public:
        explicit DebrisManager(SDL_Renderer* renderer);

        // Crear explosió a partir d'una forma
        // - shape: forma vectorial a explotar
        // - centre: posició del centre de l'objecte
        // - angle: orientació de l'objecte (radians)
        // - escala: escala de l'objecte (1.0 = normal)
        // - velocitat_base: velocitat inicial dels fragments (px/s)
        void explotar(const std::shared_ptr<Graphics::Shape>& shape,
            const Punt& centre,
            float angle,
            float escala,
            float velocitat_base);

        // Actualitzar tots els fragments actius
        void actualitzar(float delta_time);

        // Dibuixar tots els fragments actius
        void dibuixar() const;

        // Reiniciar tots els fragments (neteja)
        void reiniciar();

        // Obtenir número de fragments actius
        int get_num_actius() const;

    private:
        SDL_Renderer* renderer_;

        // Pool de fragments (màxim concurrent)
        // Un pentàgon té 5 línies, 15 enemics = 75 línies
        // + nau (3 línies) + bales (5 línies * 3) = 93 línies màxim
        // Arrodonit a 100 per seguretat
        static constexpr int MAX_DEBRIS = 100;
        std::array<Debris, MAX_DEBRIS> debris_pool_;

        // Trobar primer slot inactiu
        Debris* trobar_slot_lliure();

        // Calcular direcció perpendicular a un segment
        Punt calcular_direccio_perpendicular(const Punt& p1, const Punt& p2) const;
};

}  // namespace Effects
