// trail_manager.hpp - Estela de partícules daurades darrere la nau
// © 2026 JailDesigner

#pragma once

#include <SDL3/SDL.h>

#include <array>
#include <cstdint>
#include <memory>

#include "core/defaults/trail.hpp"
#include "core/graphics/shape.hpp"
#include "core/rendering/render_context.hpp"
#include "core/types.hpp"
#include "game/entities/ship.hpp"

namespace Effects {

    // Manté un pool fixe de partícules amb forma d'estrella (star.shp) que
    // pulsen entre groc i daurat, oscil·len al voltant del seu naixement i
    // encongeixen fins a desaparèixer. Les naus actives emeten quan superen
    // SPEED_THRESHOLD_PX_S.
    class TrailManager {
       public:
        explicit TrailManager(Rendering::Renderer* renderer);

        void update(float delta_time, const std::array<Ship, 2>& ships);
        void draw() const;
        void reset();

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

       private:
        struct Particle {
            bool active{false};
            std::uint8_t player_id{0};  // 0=P1, 1=P2 — selecciona paleta de colors
            Vec2 origin{};              // punt de naixement (no es desplaça)
            float phase_x{0.0F};        // fase oscil·lació horitzontal
            float phase_y{0.0F};
            float phase_pulse{0.0F};
            float age{0.0F};
            float lifetime{0.0F};
            float scale{1.0F};
        };

        void tryEmitFromShip(const Ship& ship, std::uint8_t player_id, float delta_time);
        void emitAt(Vec2 pos, std::uint8_t player_id);
        auto findFreeSlot() -> int;
        void drawParticle(const Particle& particle) const;

        Rendering::Renderer* renderer_;
        std::shared_ptr<Graphics::Shape> star_shape_;
        std::array<Particle, Defaults::Trail::POOL_SIZE> pool_{};
        std::array<float, 2> emit_cooldown_{0.0F, 0.0F};
        float time_accumulator_{0.0F};
    };

}  // namespace Effects
