#pragma once

#include <string>  // for string, basic_string
#include <vector>  // for vector
struct options_t;

class Stats
{
private:
	struct stats_t
	{
		std::string name; // Nombre de la habitación
		int visited;	  // Cuenta las veces que se ha visitado una habitación
		int died;		  // Cuenta las veces que se ha muerto en una habitación
	};

	struct stats_dictionary_t
	{
		std::string number; // Numero de la habitación
		std::string name;	// Nombre de la habitación
	};

	// Punteros y objetos
	options_t *options; // Puntero a la variable con todas las opciones del programa

	// Variables
	std::vector<stats_dictionary_t> dictionary; // Lista con la equivalencia nombre-numero de habitacion
	std::vector<stats_t> bufferList;			// Lista con las estadisticas temporales por habitación
	std::vector<stats_t> list;					// Lista con las estadisticas completas por habitación
	std::string bufferPath;						// Fichero con las estadísticas temporales
	std::string filePath;						// Fichero con las estadísticas completas

	// Busca una entrada en la lista por nombre
	int findByName(std::string name, std::vector<stats_t> &list);

	// Carga las estadisticas desde un fichero
	bool loadFromFile(std::string filePath, std::vector<stats_t> &list);

	// Guarda las estadisticas en un fichero
	void saveToFile(std::string filePath, std::vector<stats_t> &list);

	// Calcula cual es la habitación con más muertes
	void checkWorstNightmare();

	// Obtiene el nombre de una habitación a partir del número
	std::string numberToName(std::string number);

	// Obtiene el número de una habitación a partir del nombre
	std::string nameToNumber(std::string name);

	// Vuelca los datos del buffer en la lista de estadisticas
	void updateListFromBuffer();

public:
	// Constructor
	Stats(std::string file, std::string buffer, options_t *options);

	// Destructor
	~Stats();

	// Inicializador
	// Se debe llamar a este procedimiento una vez se haya creado el diccionario numero-nombre
	void init();

	// Añade una muerte a las estadisticas
	void addDeath(std::string name);

	// Añade una visita a las estadisticas
	void addVisit(std::string name);

	// Añade una entrada al diccionario
	void addDictionary(std::string number, std::string name);
};