#pragma once

#include <SDL3/SDL.h>  // Para Uint8

#include <memory>  // Para unique_ptr
#include <string>  // Para string

#include "core/rendering/sprite/animated_sprite.hpp"  // Para AnimatedSprite
#include "utils/utils.hpp"                            // Para Circle

// --- Clase Bullet: representa una bala del jugador ---
class Bullet {
   public:
    // --- Constantes ---
    static constexpr float WIDTH = 12.0F;   // Anchura de la bala
    static constexpr float HEIGHT = 12.0F;  // Altura de la bala

    // --- Enums ---
    enum class Type : Uint8 {
        UP,     // Bala hacia arriba
        LEFT,   // Bala hacia la izquierda
        RIGHT,  // Bala hacia la derecha
        NONE    // Sin bala
    };

    enum class MoveStatus : Uint8 {
        OK = 0,  // Movimiento normal
        OUT = 1  // Fuera de los límites
    };

    enum class Color : Uint8 {
        YELLOW,
        GREEN,
        RED,
        PURPLE
    };

    // --- Constructor y destructor ---
    Bullet(float x, float y, Type type, Color color, int owner);  // Constructor principal
    ~Bullet() = default;                                          // Destructor

    // --- Métodos principales ---
    void render();                                // Dibuja la bala en pantalla
    auto update(float delta_time) -> MoveStatus;  // Actualiza el estado del objeto (time-based)
    void disable();                               // Desactiva la bala

    // --- Getters ---
    [[nodiscard]] auto isEnabled() const -> bool;  // Comprueba si está activa
    [[nodiscard]] auto getOwner() const -> int;    // Devuelve el identificador del dueño
    auto getCollider() -> Circle&;                 // Devuelve el círculo de colisión

   private:
    // --- Constantes ---
    static constexpr float VEL_Y = -180.0F;       // Velocidad vertical (pixels/segundo) - era -0.18F pixels/ms
    static constexpr float VEL_X_LEFT = -120.0F;  // Velocidad izquierda (pixels/segundo) - era -0.12F pixels/ms
    static constexpr float VEL_X_RIGHT = 120.0F;  // Velocidad derecha (pixels/segundo) - era 0.12F pixels/ms
    static constexpr float VEL_X_CENTER = 0.0F;   // Velocidad central

    // --- Objetos y punteros ---
    std::unique_ptr<AnimatedSprite> sprite_;  // Sprite con los gráficos

    // --- Variables de estado ---
    Circle collider_;  // Círculo de colisión
    Type type_;        // Tipo de bala
    int owner_;        // Identificador del jugador
    float pos_x_;      // Posición en el eje X
    float pos_y_;      // Posición en el eje Y
    float vel_x_;      // Velocidad en el eje X

    // --- Métodos internos ---
    void shiftColliders();                                                    // Ajusta el círculo de colisión
    void shiftSprite();                                                       // Ajusta el sprite
    auto move(float delta_time) -> MoveStatus;                                // Mueve la bala y devuelve su estado (time-based)
    static auto calculateVelocity(Type type) -> float;                        // Calcula la velocidad horizontal de la bala
    static auto buildAnimationString(Type type, Color color) -> std::string;  // Construye el string de animación
};
