#pragma once

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

// Struct para los logros
struct Achievement
{
	int id;					 // Identificador del logro
	std::string caption;	 // Texto con el nombre del logro
	std::string description; // Texto que describe el logro
	int icon;				 // Indice del icono a utilizar en la notificación
	bool completed;			 // Indica si se ha obtenido el logro
	bool obtainable;		 // Indica si se puede obtener el logro

	// Constructor vacío
	Achievement() : id(0), icon(0), completed(false), obtainable(true) {}

	// Constructor parametrizado
	Achievement(int id, const std::string &caption, const std::string &description, int icon, bool completed = false, bool obtainable = true)
		: id(id), caption(caption), description(description), icon(icon), completed(completed), obtainable(obtainable) {}
};

class Cheevos
{
private:
	// [SINGLETON] Objeto privado
	static Cheevos *cheevos_;

	// Variables
	std::vector<Achievement> cheevos_list_; // Listado de logros
	bool enabled_ = true;					// Indica si los logros se pueden obtener
	std::string file_;						// Fichero donde leer/almacenar el estado de los logros

	// Inicializa los logros
	void init();

	// Busca un logro por id y devuelve el índice
	int find(int id);

	// Carga el estado de los logros desde un fichero
	void loadFromFile();

	// Guarda el estado de los logros en un fichero
	void saveToFile();

	// Constructor
	explicit Cheevos(const std::string &file);

	// Destructor
	~Cheevos();

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

	// [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 Cheevos *get();

	// Desbloquea un logro
	void unlock(int id);

	// Invalida un logro
	void setUnobtainable(int id);

	// Elimina el estado "no obtenible"
	void clearUnobtainableState();

	// Habilita o deshabilita los logros
	void enable(bool value) { enabled_ = value; }

	// Lista los logros
	std::vector<Achievement> list() { return cheevos_list_; }

	// Devuelve el número total de logros desbloqueados
	int getTotalUnlockedAchievements();

	// Devuelve el número total de logros
	int size() { return cheevos_list_.size(); }
};
