#pragma once

#include <string>  // Para string
#include <utility>
#include <vector>  // Para vector

class Cheevos {
   public:
    // Tipos anidados (públicos porque se usan en la interfaz)
    struct Achievement {
        int id{0};                // Identificador del logro
        std::string caption;      // Texto con el nombre del logro
        std::string description;  // Texto que describe el logro
        int icon{0};              // Indice del icono a utilizar en la notificación
        bool completed{false};    // Indica si se ha obtenido el logro
        bool obtainable{true};    // Indica si se puede obtener el logro
    };

    using Achievements = std::vector<Achievement>;  // Type alias para vector de logros

    // Gestión singleton
    static void init(const std::string& file);  // Inicialización
    static void destroy();                      // Destrucción
    static auto get() -> Cheevos*;              // Acceso al singleton

    // Gestión de logros
    void unlock(int id);                           // Desbloquea un logro
    void setUnobtainable(int id);                  // Invalida un logro
    void clearUnobtainableState();                 // Elimina el estado "no obtenible"
    void enable(bool value) { enabled_ = value; }  // Habilita o deshabilita los logros

    // Consultas
    [[nodiscard]] auto list() const -> const Achievements& { return cheevos_list_; }  // Lista los logros
    auto getTotalUnlockedAchievements() -> int;                                       // Devuelve logros desbloqueados
    auto size() -> int { return cheevos_list_.size(); }                               // Devuelve número total de logros

   private:
    // Constantes singleton
    static Cheevos* cheevos;  // [SINGLETON] Objeto privado

    // Métodos privados
    void init();               // Inicializa los logros
    auto find(int id) -> int;  // Busca un logro por id y devuelve el índice
    void loadFromFile();       // Carga el estado de los logros desde un fichero
    void saveToFile();         // Guarda el estado de los logros en un fichero

    // Constructor y destructor privados [SINGLETON]
    explicit Cheevos(std::string file);
    ~Cheevos();

    // Variables miembro
    Achievements 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
};
