#pragma once

#include <string> // Para string
#include <vector> // Para vector
#include "utils.h"

enum assetType
{
	t_bitmap,
	t_music,
	t_sound,
	t_font,
	t_lang,
	t_data,
	t_room,
	t_enemy,
	t_item,
	t_maxAssetType
};

// Clase Asset
class Asset
{
private:
	// [SINGLETON] Objeto asset privado
	static Asset *asset_;

	// Estructura para definir un item
	struct item_t
	{
		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
	};

	// Variables
	int longest_name_ = 0;		  // Contiene la longitud del nombre de fichero mas largo
	std::vector<item_t> fileList; // Listado con todas las rutas a los ficheros
	std::string executable_path_; // Ruta al ejecutable
	bool verbose_ = true;		  // Indica si ha de mostrar información por pantalla

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

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

	// Constructor
	explicit Asset(const std::string &executable_path)
		: executable_path_(getPath(executable_path)) {}

	// Destructor
	~Asset() = default;

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

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

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

	// Añade un elemento a la lista
	void add(std::string file, enum 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);

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

	// Establece si ha de mostrar texto por pantalla
	void setVerbose(bool value);
};
