#pragma once

#include <SDL3/SDL_stdinc.h> // Para Uint8
#include <memory>			 // Para shared_ptr, unique_ptr
#include "sprite.h"			 // Para Sprite
#include "utils.h"			 // Para Circle
class Texture;

// Tipos de balas
enum class BulletType : Uint8
{
	UP,
	LEFT,
	RIGHT,
	NONE
};

// Resultado del movimiento de la bala
enum class BulletMoveStatus : Uint8
{
	OK = 0,
	OUT = 1
};

// Clase Bullet
class Bullet
{
public:
	// Constructor y Destructor
	Bullet(float x, float y, BulletType bullet_type, bool powered_up, int owner, std::shared_ptr<Texture> texture);
	~Bullet() = default;

	// Métodos principales
	void render();			 // Dibuja la bala en pantalla
	BulletMoveStatus move(); // Mueve la bala y devuelve su estado

	// Estado de la bala
	bool isEnabled() const; // Comprueba si está activa
	void disable();			// Desactiva la bala

	// Getters
	int getOwner() const;  // Devuelve el identificador del dueño
	Circle &getCollider(); // Devuelve el círculo de colisión

private:
	// Constantes
	static constexpr float BULLET_WIDTH_ = 12.0f;
	static constexpr float BULLET_HEIGHT_ = 12.0f;
	static constexpr float BULLET_VEL_Y_ = -3.0f;
	static constexpr float BULLET_VEL_X_LEFT_ = -2.0f;
	static constexpr float BULLET_VEL_X_RIGHT_ = 2.0f;

	// Propiedades
	std::unique_ptr<Sprite> sprite_; // Sprite con los gráficos

	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

	BulletType bullet_type_; // Tipo de bala
	int owner_;				 // Identificador del dueño
	Circle collider_;		 // Círculo de colisión

	// Métodos internos
	void shiftColliders(); // Ajusta el círculo de colisión
	void shiftSprite();	   // Ajusta el sprite
};
