#pragma once

#include <SDL2/SDL_rect.h> // for SDL_Rect, SDL_Point
#include <memory>		   // for shared_ptr, __shared_ptr_access
#include <string>		   // for string
#include <vector>		   // for vector
#include "s_sprite.h"	   // for SSprite
#include "surface.h"	   // for Texture
#include "utils.h"		   // for Color

struct ItemData
{
	std::string tile_set_file; // Ruta al fichero con los gráficos del item
	int x;					   // Posición del item en pantalla
	int y;					   // Posición del item en pantalla
	int tile;				   // Número de tile dentro de la textura
	int counter;			   // Contador inicial. Es el que lo hace cambiar de color
	Uint8 color1;			   // Uno de los dos colores que se utiliza para el item
	Uint8 color2;			   // Uno de los dos colores que se utiliza para el item

	// Constructor
	ItemData() : x(0), y(0), tile(0), counter(0), color1(), color2() {}
};

class Item
{
private:
	// Constantes
	static constexpr int ITEM_SIZE_ = 8;

	// Objetos y punteros
	std::shared_ptr<SSprite> sprite_; // SSprite del objeto

	// Variables
	std::vector<Uint8> color_; // Vector con los colores del objeto
	int counter_;			   // Contador interno
	SDL_Rect collider_;		   // Rectangulo de colisión
	int change_color_speed;	   // Cuanto mas alto, mas tarda en cambiar de color

public:
	// Constructor
	explicit Item(ItemData item);

	// Destructor
	~Item() = default;

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

	// Actualiza las variables del objeto
	void update() { counter_++; }

	// Obtiene el rectangulo de colision del objeto
	SDL_Rect &getCollider() { return collider_; }

	// Obtiene su ubicación
	SDL_Point getPos();

	// Asigna los colores del objeto
	void setColors(Uint8 col1, Uint8 col2);
};