// effects.hpp - Constants per a efectes visuals (fireworks, etc.)
// © 2026 JailDesigner

#pragma once

#include <SDL3/SDL.h>

namespace Defaults::FX::Glow {

    // Neon glow per outline gruixut, aplicat automàticament per renderShape.
    // Els gruixos d'halo són RÀTIOS del bounding_radius de la shape (escalat
    // per scale), de manera que un pentàgon (radius 20) té halo gros i una bala
    // (radius 3) té halo subtil. El core (últim pass) usa el gruix de línia
    // global (1.5px) — no escala amb la shape.
    //
    // Cap superior: si la shape és molt gran (logos del títol, intro), el
    // bounding_radius es satura a aquest valor — així cap shape té més
    // glow que el pentàgon (referència de gameplay).
    constexpr float MAX_REFERENCE_RADIUS = 20.0F;

    struct Pass {
        float thickness_ratio;  // % del bounding_radius*scale. <0 → usa core (gruix global)
        float alpha;
    };
    constexpr Pass PASSES[] = {
        {.thickness_ratio = 0.55F, .alpha = 0.07F},
        {.thickness_ratio = 0.35F, .alpha = 0.14F},
        {.thickness_ratio = 0.20F, .alpha = 0.28F},
        {.thickness_ratio = -1.0F, .alpha = 1.0F},  // core: línia "real"
    };

    // Glow per a línies "raw" (sense shape). Gruixos absoluts (px), no
    // ratios — una línia individual no té bounding radius. Útil per a
    // partícules de firework, sparks, etc.
    namespace Line {
        struct Pass {
            float thickness;  // px. <0 → usa el thickness passat pel caller (core)
            float alpha;
        };
        constexpr Pass PASSES[] = {
            {.thickness = 18.0F, .alpha = 0.10F},
            {.thickness = 12.0F, .alpha = 0.20F},
            {.thickness = 6.0F, .alpha = 0.40F},
            {.thickness = -1.0F, .alpha = 1.0F},  // core: línia "real"
        };
    }  // namespace Line

}  // namespace Defaults::FX::Glow

namespace Defaults::FX::Firework {

    // Color per defecte. La caller pot fer override (p.ex. heretar del pare),
    // però per defecte no l'heretem — feel més neutre/lluminós.
    constexpr SDL_Color DEFAULT_COLOR = {.r = 255, .g = 255, .b = 255, .a = 255};

    // Velocitat inicial radial al spawn (px/s) i variació entre punts.
    constexpr float SPEED = 250.0F;
    constexpr float SPEED_VARIATION = 30.0F;  // ±

    // Quantitat de línies per burst (per defecte).
    constexpr int N_POINTS = 100;

    // Distribució angular: jitter aleatori sobre el repartiment uniforme.
    constexpr float ANGULAR_JITTER_DEG = 12.0F;

    // Fase 1 (creixement): la línia neix amb longitud 0 i creix fins a max.
    constexpr float GROW_DURATION = 0.08F;  // s
    constexpr float MAX_LENGTH = 25.0F;     // px

    // Fricció lineal (px/s²). Negativa per frenar.
    constexpr float FRICTION = -180.0F;

    // Llindar de mort: per sota d'aquesta longitud (px) o brillor, la
    // partícula es marca inactiva.
    constexpr float MIN_LENGTH = 0.5F;
    constexpr float MIN_BRIGHTNESS = 0.02F;

    // Brillor inicial per defecte.
    constexpr float INITIAL_BRIGHTNESS = 1.0F;

    // Restitució en rebot contra els límits del PLAYAREA (mateix patró que debris).
    constexpr float RESTITUTION_BOUNDS = 0.7F;

    // Mida del pool. 8 punts × ~25 bursts simultanis.
    constexpr int POOL_SIZE = 2000;

}  // namespace Defaults::FX::Firework
