// 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)
        // - brightness: factor de brillantor heretat (0.0-1.0, per defecte 1.0)
        // - velocitat_objecte: velocitat de l'objecte que explota (px/s, per defecte 0)
        // - velocitat_angular: velocitat angular heretada (rad/s, per defecte 0)
        // - factor_herencia_visual: factor de herència rotació visual (0.0-1.0, per defecte 0.0)
        void explotar(const std::shared_ptr<Graphics::Shape>& shape,
            const Punt& centre,
            float angle,
            float escala,
            float velocitat_base,
            float brightness = 1.0F,
            const Punt& velocitat_objecte = {.x = 0.0F, .y = 0.0F},
            float velocitat_angular = 0.0F,
            float factor_herencia_visual = 0.0F,
            const std::string& sound = Defaults::Sound::EXPLOSION);

        // 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
        [[nodiscard]] 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 = 150;
        std::array<Debris, MAX_DEBRIS> debris_pool_;

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

        // Calcular direcció d'explosió (radial, des del centre cap al segment)
        [[nodiscard]] Punt calcular_direccio_explosio(const Punt& p1, const Punt& p2, const Punt& centre_objecte) const;
};

}  // namespace Effects
