#pragma once

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

// 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
{
private:
	// Constantes
	static constexpr int BULLET_WIDTH_ = 12;
	static constexpr int BULLET_HEIGHT_ = 12;
	static constexpr int BULLET_VEL_Y_ = -3;
	static constexpr int BULLET_VEL_X_LEFT_ = -2;
	static constexpr int BULLET_VEL_X_RIGHT_ = 2;

	std::unique_ptr<Sprite> sprite_; // Sprite con los gráficos y métodos de pintado

	int pos_x_; // Posición en el eje X
	int pos_y_; // Posición en el eje Y
	int vel_x_; // Velocidad en el eje X

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

	void shiftColliders(); // Alinea el círculo de colisión con el objeto
	void shiftSprite();	   // Alinea el sprite con el objeto

public:
	// Constructor
	Bullet(int x, int y, BulletType bullet_type, bool powered_up, int owner, std::shared_ptr<Texture> texture);

	// Destructor
	~Bullet() = default;

	// Pinta el objeto en pantalla
	void render();

	// Actualiza la posición y estado del objeto
	BulletMoveStatus move();

	// Comprueba si el objeto está habilitado
	bool isEnabled() const;

	// Deshabilita el objeto
	void disable();

	// Obtiene parámetros
	int getOwner() const;
	Circle &getCollider();
};
