#pragma once

#include <string>  // Para string
#include <vector>  // Para 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> buffer_list_;       // Lista con las estadisticas temporales por habitación
        std::vector<StatsData> list_;              // Lista con las estadisticas completas por habitación
        std::string buffer_path_;                  // Fichero con las estadísticas temporales
        std::string file_path_;                    // Fichero con las estadísticas completas

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

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

        // Guarda las estadisticas en un fichero
        static void saveToFile(const std::string& file_path, 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:
        // Constructostd::string nst stdstd::string nst std::string& buffer);
        Stats(std::string file, 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);
};