#pragma once

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

class Stats
{
private:
	struct StatsData
	{
		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 StatsDictionary
	{
		std::string number; // Numero de la habitación
		std::string name;	// Nombre de la habitación
	};

	// Variables
	std::vector<StatsDictionary> dictionary; // Lista con la equivalencia nombre-numero de habitacion
	std::vector<StatsData> bufferList;			// Lista con las estadisticas temporales por habitación
	std::vector<StatsData> 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(const std::string &name, const std::vector<StatsData> &list);

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

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

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

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

public:
	// Constructor
	Stats(const std::string &file, const std::string &buffer);

	// 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(const std::string &name);

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

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