// enemies.hpp - Configuració per tipus d'enemic (Pentagon/Cuadrado/Molinillo), spawn i scoring
// © 2026 JailDesigner

#pragma once

#include "core/defaults/entities.hpp"

namespace Defaults::Enemies {

    // Cuerpo físico común (valores por defecto del constructor)
    namespace Body {
        constexpr float DEFAULT_MASS = 5.0F;    // Más liviano que la nave (10.0)
        constexpr float RESTITUTION = 1.0F;     // Rebote elástico perfecto contra paredes
        constexpr float LINEAR_DAMPING = 0.0F;  // Sin fricción: mantienen velocidad
        constexpr float ANGULAR_DAMPING = 0.0F;
    }  // namespace Body

    // Pentagon (esquivador - zigzag evasion)
    namespace Pentagon {
        constexpr float VELOCITAT = 35.0F;              // px/s (slightly slower)
        constexpr float MASS = 5.0F;                    // Masa estándar
        constexpr float CANVI_ANGLE_PROB = 0.20F;       // 20% per wall hit (frequent zigzag)
        constexpr float CANVI_ANGLE_MAX = 1.0F;         // Max random angle change (rad)
        constexpr float ZIGZAG_PROB_PER_SECOND = 0.8F;  // Probabilidad de zigzag por segundo
        constexpr float DROTACIO_MIN = 0.75F;           // Min visual rotation (rad/s) [+50%]
        constexpr float DROTACIO_MAX = 3.75F;           // Max visual rotation (rad/s) [+50%]
        constexpr const char* SHAPE_FILE = "enemy_pentagon.shp";
    }  // namespace Pentagon

    // Cuadrado (perseguidor - tracks player)
    namespace Cuadrado {
        constexpr float VELOCITAT = 40.0F;         // px/s (medium speed)
        constexpr float MASS = 8.0F;               // Más pesado, "tanque"
        constexpr float TRACKING_STRENGTH = 0.5F;  // Interpolation toward player (0.0-1.0)
        constexpr float TRACKING_INTERVAL = 1.0F;  // Seconds between angle updates
        constexpr float DROTACIO_MIN = 0.3F;       // Slow rotation [+50%]
        constexpr float DROTACIO_MAX = 1.5F;       // [+50%]
        constexpr const char* SHAPE_FILE = "enemy_square.shp";
    }  // namespace Cuadrado

    // Molinillo (agressiu - fast straight lines, proximity spin-up)
    namespace Molinillo {
        constexpr float VELOCITAT = 50.0F;                     // px/s (fastest)
        constexpr float MASS = 4.0F;                           // Más liviano, ágil
        constexpr float CANVI_ANGLE_PROB = 0.05F;              // 5% per wall hit (rare direction change)
        constexpr float CANVI_ANGLE_MAX = 0.3F;                // Small angle adjustments
        constexpr float DROTACIO_MIN = 3.0F;                   // Base rotation (rad/s) [+50%]
        constexpr float DROTACIO_MAX = 6.0F;                   // [+50%]
        constexpr float DROTACIO_PROXIMITY_MULTIPLIER = 3.0F;  // Spin-up multiplier when near ship
        constexpr float PROXIMITY_DISTANCE = 100.0F;           // Distance threshold (px)
        constexpr const char* SHAPE_FILE = "enemy_pinwheel.shp";
    }  // namespace Molinillo

    // Animation parameters (shared)
    namespace Animation {
        // Palpitation
        constexpr float PALPITACIO_TRIGGER_PROB = 0.01F;  // 1% chance per second
        constexpr float PALPITACIO_DURACIO_MIN = 1.0F;    // Min duration (seconds)
        constexpr float PALPITACIO_DURACIO_MAX = 3.0F;    // Max duration (seconds)
        constexpr float PALPITACIO_AMPLITUD_MIN = 0.08F;  // Min scale variation
        constexpr float PALPITACIO_AMPLITUD_MAX = 0.20F;  // Max scale variation
        constexpr float PALPITACIO_FREQ_MIN = 1.5F;       // Min frequency (Hz)
        constexpr float PALPITACIO_FREQ_MAX = 3.0F;       // Max frequency (Hz)

        // Rotation acceleration
        constexpr float ROTACIO_ACCEL_TRIGGER_PROB = 0.02F;   // 2% chance per second [4x more frequent]
        constexpr float ROTACIO_ACCEL_DURACIO_MIN = 3.0F;     // Min transition time
        constexpr float ROTACIO_ACCEL_DURACIO_MAX = 8.0F;     // Max transition time
        constexpr float ROTACIO_ACCEL_MULTIPLIER_MIN = 0.3F;  // Min speed multiplier [more dramatic]
        constexpr float ROTACIO_ACCEL_MULTIPLIER_MAX = 4.0F;  // Max speed multiplier [more dramatic]
    }  // namespace Animation

    // Wounded state (entre primer impacto y explosión)
    namespace Wounded {
        constexpr float DURATION = 1.0F;   // Segundos en estado herido antes de explotar
        constexpr float BLINK_HZ = 10.0F;  // Frecuencia de parpadeo color tipo ↔ dorado
    }  // namespace Wounded

    // Spawn safety and invulnerability system
    namespace Spawn {
        // Safe spawn distance from player
        constexpr float SAFETY_DISTANCE_MULTIPLIER = 3.0F;                                               // 3x ship radius
        constexpr float SAFETY_DISTANCE = Defaults::Entities::SHIP_RADIUS * SAFETY_DISTANCE_MULTIPLIER;  // 36.0f px
        constexpr int MAX_SPAWN_ATTEMPTS = 50;                                                           // Max attempts to find safe position

        // Invulnerability system
        constexpr float INVULNERABILITY_DURATION = 3.0F;          // Seconds
        constexpr float INVULNERABILITY_BRIGHTNESS_START = 0.3F;  // Dim
        constexpr float INVULNERABILITY_BRIGHTNESS_END = 0.7F;    // Normal (same as Defaults::Brightness::ENEMIC)
        constexpr float INVULNERABILITY_SCALE_START = 0.0F;       // Invisible
        constexpr float INVULNERABILITY_SCALE_END = 1.0F;         // Full size
    }  // namespace Spawn

    // Scoring system (puntuación per type de enemy)
    namespace Scoring {
        constexpr int PENTAGON_SCORE = 100;   // Pentágono (esquivador, 35 px/s)
        constexpr int QUADRAT_SCORE = 150;    // Cuadrado (perseguidor, 40 px/s)
        constexpr int MOLINILLO_SCORE = 200;  // Molinillo (agressiu, 50 px/s)
    }  // namespace Scoring

}  // namespace Defaults::Enemies
