#pragma once

#include <string>  // for string, basic_string
#include <vector>  // for vector

enum class AssetType
{
	BITMAP,
	MUSIC,
	SOUND,
	FONT,
	LANG,
	DATA,
	ANIMATION,
	PALETTE,
	ITEM,
	MAX_ASSET_TYPE,
};

// Clase Asset
class Asset
{
private:
	// [SINGLETON] Objeto asset privado para Don Melitón
	static Asset *asset;

	// Estructura para definir un item
	struct AssetItem
	{
		std::string file;	 // Ruta del fichero desde la raiz del directorio
		enum AssetType type; // Indica el tipo de recurso
		bool required;		 // Indica si es un fichero que debe de existir
							 // bool absolute;		 // Indica si la ruta que se ha proporcionado es una ruta absoluta
	};

	// Variables
	int longest_name_;			  // Contiene la longitud del nombre de fichero mas largo
	std::vector<AssetItem> file_list_; // Listado con todas las rutas a los ficheros
	std::string executable_path_;	  // Ruta al ejecutable

	// Comprueba que existe un fichero
	bool checkFile(std::string executable_path) const;

	// Devuelve el nombre del tipo de recurso
	std::string getTypeName(int type) const;

	// Constructor
	Asset(std::string path);

	// Destructor
	~Asset() = default;

public:
	// [SINGLETON] Crearemos el objeto screen con esta función estática
	static void init(std::string path);

	// [SINGLETON] Destruiremos el objeto screen con esta función estática
	static void destroy();

	// [SINGLETON] Con este método obtenemos el objeto screen y podemos trabajar con él
	static Asset *get();

	// Añade un elemento a la lista
	void add(std::string file, AssetType type, bool required = true, bool absolute = false);

	// Devuelve un elemento de la lista a partir de una cadena
	std::string get(std::string text) const;

	// Comprueba que existen todos los elementos
	bool check() const;

	// Devuelve la lista de recursos de un tipo
	std::vector<std::string> getListByType(AssetType type) const;
};