// firework_manager.hpp - Gestor de bursts radials (fireworks)
// © 2026 JailDesigner

#pragma once

#include <SDL3/SDL.h>

#include <array>
#include <functional>
#include <utility>

#include "core/defaults.hpp"
#include "core/rendering/render_context.hpp"
#include "core/types.hpp"
#include "firework.hpp"

namespace Effects {

    // Pool de partícules. spawn() emet un burst d'N línies radials des
    // d'`origen`. Cada partícula viu independent (update/draw/rebot).
    class FireworkManager {
       public:
        // Notificació opcional cada vegada que es genera un burst.
        using SpawnCallback = std::function<void(Vec2 origen)>;

        explicit FireworkManager(Rendering::Renderer* renderer);

        void setSpawnCallback(SpawnCallback callback) {
            spawn_callback_ = std::move(callback);
        }

        // Emet un burst radial:
        //   origen: punt central del burst.
        //   color: color de les línies (heretat del pare).
        //   initial_speed: velocitat radial inicial (px/s).
        //   n_points: nombre de línies. Default Defaults::FX::Firework::N_POINTS.
        //   initial_brightness: 0..1.
        //   glow: si true, cada partícula es renderitza amb halo neon.
        //   glow_color: color del halo. Si alpha==0, agafa el color de la línia.
        void spawn(const Vec2& origen,
            SDL_Color color = Defaults::FX::Firework::DEFAULT_COLOR,
            float initial_speed = Defaults::FX::Firework::SPEED,
            int n_points = Defaults::FX::Firework::N_POINTS,
            float initial_brightness = Defaults::FX::Firework::INITIAL_BRIGHTNESS,
            bool glow = false,
            SDL_Color glow_color = {0, 0, 0, 0});

        void update(float delta_time);
        void draw() const;
        void reset();

        [[nodiscard]] auto getActiveCount() const -> int;

       private:
        Rendering::Renderer* renderer_;
        SpawnCallback spawn_callback_;

        static constexpr int POOL_SIZE = Defaults::FX::Firework::POOL_SIZE;
        std::array<Firework, POOL_SIZE> pool_;

        auto findFreeSlot() -> Firework*;
    };

}  // namespace Effects
