#pragma once

#include <string> // Para std::string
#include <vector> // Para std::vector

/*
    Esta clase sirve para añadir elementos HiScoreEntry a un vector (tabla), de manera
    que la tabla siempre está ordenada.

    Además tiene un método para dejar la tabla con sus valores iniciales y métodos para
    leer y escribir la tabla a un fichero.
*/

// --- Estructura para las entradas de la tabla de records ---
struct HiScoreEntry
{
    std::string name;         // Nombre
    int score;                // Puntuación
    bool one_credit_complete; // Indica si se ha conseguido 1CC

    // Constructor
    explicit HiScoreEntry(const std::string &n = "", int s = 0, bool occ = false)
        : name(n.substr(0, 6)), score(s), one_credit_complete(occ) {}
};

// --- Clase ManageHiScoreTable ---
class ManageHiScoreTable
{
public:
    // Constructor
    explicit ManageHiScoreTable(std::vector<HiScoreEntry> &table)
        : table_(table) {}

    // Destructor
    ~ManageHiScoreTable() = default;

    // Resetea la tabla a los valores por defecto
    void clear();

    // Añade un elemento a la tabla (devuelve la posición en la que se inserta)
    int add(const HiScoreEntry &entry);

    // Carga la tabla con los datos de un fichero
    bool loadFromFile(const std::string &file_path);

    // Guarda la tabla en un fichero
    bool saveToFile(const std::string &file_path);

private:
    // Referencia a la tabla con los records
    std::vector<HiScoreEntry> &table_;

    // Ordena la tabla internamente
    void sort();
};