// debris.hpp - Fragment de línia volant (explosión de formes)
// © 2026 JailDesigner

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

#include "core/types.hpp"

namespace Effects {

    // Debris: un segment de línia que vola perpendicular a sí mismo
    // Representa un fragment de una shape destruïda (ship, enemy, bullet).
    //
    // Representació autoritaritzada (font de veritat per a la geometria):
    //   centro + original_angle (orientació spawn) + angle_rotacio (acumulat)
    //   + original_half_length × shrink_factor (mida actual)
    // p1/p2 es reconstrueixen cada frame en update() des d'aquestes dades, mai
    // de forma iterativa — evita bugs de rotació quadràtica i shrink exponencial.
    struct Debris {
        // Geometria del segment (2 points en coordenades mundials, derivats)
        Vec2 p1;
        Vec2 p2;

        // Geometria original (font de veritat, no canvia després del spawn)
        Vec2 centro;                 // Centre actual del segment (es mou amb velocity)
        float original_angle;        // Orientació del segment al spawn (rad)
        float original_half_length;  // Mitja-longitud al spawn (px)

        // Física
        Vec2 velocity;       // Velocidad en px/s (components x, y)
        float acceleration;  // Aceleración negativa (fricció) en px/s²

        // Rotación
        float angle_rotacio;         // Acumulat de rotació visual des del spawn (radians)
        float velocitat_rot;         // Velocidad de rotación de TRAYECTORIA (rad/s)
        float velocitat_rot_visual;  // Velocidad de rotación VISUAL del segment (rad/s)

        // Estat de vida
        // Política: viu sempre durant min_lifetime, després mor quan
        // |velocity| < MIN_SPEED_TO_DIE (definit en Defaults). Així els
        // fragments ràpids no "popen" en moviment.
        float temps_vida;    // Temps transcorregut (segons)
        float min_lifetime;  // Temps mínim garantit (segons)
        bool active;         // Està actiu?

        // Shrinking (reducció de distancia entre points)
        float factor_shrink;  // Factor de reducció per segon (0.0-1.0)

        // Rendering
        float brightness;   // Factor de brightness (0.0-1.0, heretat de l'objecte original)
        SDL_Color color{};  // Color heredado del padre. alpha==0 → usa global oscilador
    };

}  // namespace Effects
