#pragma once

#include <SDL3/SDL.h>

#include <cstdint>  // for uint8_t

#include "utils/utils.h"  // for Circle
class Sprite;
class Texture;

// Clase Bullet
class Bullet {
   public:
    // Tipus de bala. Enum class fortament tipat per evitar confusió accidental
    // amb altres `int`/`Uint8` (p.ex. el `owner` a `createBullet`).
    enum class Kind : std::uint8_t {
        NONE = 0,  // bala desactivada / fora de pantalla
        UP = 1,
        LEFT = 2,
        RIGHT = 3,
    };

    // Resultado de Bullet::move()
    enum class MoveResult : std::uint8_t {
        OK = 0,
        OUT = 1,
    };

    Bullet(int x, int y, Kind kind, bool powered_up, int owner, Texture *texture, SDL_Renderer *renderer);  // Constructor
    ~Bullet();                                                                                              // Destructor

    Bullet(const Bullet &) = delete;
    auto operator=(const Bullet &) -> Bullet & = delete;

    void render();              // Pinta el objeto en pantalla
    auto move() -> MoveResult;  // Actualiza la posición y estado del objeto
    void disable();             // Deshabilita el objeto

    [[nodiscard]] auto isEnabled() const -> bool;  // Comprueba si el objeto está habilitado
    [[nodiscard]] auto getPosX() const -> int;     // Obtiene el valor de la variable
    [[nodiscard]] auto getPosY() const -> int;     // Obtiene el valor de la variable
    [[nodiscard]] auto getVelY() const -> int;     // Obtiene el valor de la variable
    [[nodiscard]] auto getKind() const -> Kind;    // Obtiene el valor de la variable
    [[nodiscard]] auto getOwner() const -> int;    // Obtiene el valor de la variable

    void setPosX(int x);  // Establece el valor de la variable
    void setPosY(int y);  // Establece el valor de la variable

    auto getCollider() -> Circle &;  // Obtiene el circulo de colisión

   private:
    // Objetos y punteros
    Sprite *sprite_;  // Sprite con los graficos y métodos de pintado

    // Variables
    int pos_x_;        // Posición en el eje X
    int pos_y_;        // Posición en el eje Y
    Uint8 width_;      // Ancho del objeto
    Uint8 height_;     // Alto del objeto
    int vel_x_;        // Velocidad en el eje X
    int vel_y_;        // Velocidad en el eje Y
    Kind kind_;        // Tipo de objeto
    int owner_;        // Identificador del dueño del objeto
    Circle collider_;  // Circulo de colisión del objeto

    void shiftColliders();  // Alinea el circulo de colisión con el objeto
};
