// physics.hpp - Constants de física del control de la nau i debris d'explosió
// © 2026 JailDesigner

#pragma once

namespace Defaults::Physics {

    constexpr float ROTATION_SPEED = 3.14F;  // rad/s (~180°/s)
    constexpr float ACCELERATION = 400.0F;   // px/s²
    constexpr float MAX_VELOCITY = 180.0F;   // px/s
    constexpr float FRICTION = 20.0F;        // px/s²

    // Bullet — impacto físico contra enemigo (impulse mass-aware).
    // Model: el impulse és el moment lineal de la bala (m·v) multiplicat per
    // un factor de transferència [0..1]. 1.0 = transfereix tot el moment
    // (col·lisió perfectament inelàstica), 0.5 = transfereix la meitat.
    namespace Bullet {
        constexpr float IMPACT_MOMENTUM_FACTOR = 3.0F;  // Factor de transferència de moment bala→enemic
    }  // namespace Bullet

    // Explosions (debris physics)
    namespace Debris {
        constexpr float VELOCITAT_BASE = 80.0F;      // Velocidad inicial (px/s)
        constexpr float VARIACIO_VELOCITAT = 40.0F;  // ±variació aleatòria (px/s)
        constexpr float ACCELERACIO = -60.0F;        // Fricció/desacceleració (px/s²)
        constexpr float ROTACIO_MIN = 0.1F;          // Rotación mínima (rad/s ~5.7°/s)
        constexpr float ROTACIO_MAX = 0.3F;          // Rotación màxima (rad/s ~17.2°/s)
        constexpr float TEMPS_VIDA = 2.0F;           // Vida mínima garantida (s) — després pot morir per velocitat baixa
        constexpr float TEMPS_VIDA_NAU = 3.0F;       // Ship debris min lifetime (matches DEATH_DURATION)
        constexpr float SHRINK_RATE = 1.0F;          // Reducció de mida (1.0 = encoge a 0 al final del min_lifetime)

        // Política de mort: passat el min_lifetime, el fragment mor quan la
        // seva velocity cau per sota d'aquest llindar. Així els fragments
        // ràpids no "popen" en moviment.
        constexpr float MIN_SPEED_TO_DIE = 5.0F;  // px/s — al cuadrat per evitar sqrt en update
        constexpr float MIN_SPEED_TO_DIE_SQ = MIN_SPEED_TO_DIE * MIN_SPEED_TO_DIE;

        // Rebot contra els límits del PLAYAREA (mateix patró que enemics/ship).
        // 0.7 = 70% de l'energia conservada al rebot.
        constexpr float RESTITUTION_BOUNDS = 0.7F;

        // Herència de velocity angular (trayectorias curvas)
        constexpr float FACTOR_HERENCIA_MIN = 0.7F;  // Mínimo 70% del drotacio heredat
        constexpr float FACTOR_HERENCIA_MAX = 1.0F;  // Màxim 100% del drotacio heredat
        constexpr float FRICCIO_ANGULAR = 0.5F;      // Desacceleració angular (rad/s²)

        // Velocity heredada de la nau a l'explosió (80% del feel original).
        constexpr float SHIP_VELOCITY_INHERITANCE = 0.8F;

        // Velocity heredada de l'enemic a l'explosió (palanca per a tuneo).
        // 1.0 = inèrcia completa; >1.0 amplifica la deriva; <1.0 la atenua.
        constexpr float ENEMY_VELOCITY_INHERITANCE = 1.0F;

        // Tuneig específic de l'explosió d'enemic (overrides als defaults
        // que es passen com a paràmetres opcionals a explode()).
        constexpr float ENEMY_LIFETIME = 2.5F;       // Vida mínima del debris (s) — els que segueixen movent-se viuen més
        constexpr float ENEMY_FRICTION = -30.0F;     // Fricció més suau perquè s'estenguin més
        constexpr int ENEMY_SEGMENT_MULTIPLIER = 1;  // Sense còpies (5 cares = 5 trossos); >1 produeix grups sincronitzats

        // Angular velocity sin for trajectory inheritance
        // Excess above this threshold is converted to tangential linear velocity
        // Prevents "vortex trap" problem with high-rotation enemies
        constexpr float VELOCITAT_ROT_MAX = 1.5F;  // rad/s (~86°/s)
    }  // namespace Debris

}  // namespace Defaults::Physics
