#pragma once

#include <string>   // Para string, basic_string
#include <utility>  // Para move

// --- Namespace Lang: gestión de idiomas y textos ---
namespace Lang {
    // --- Enums ---
    enum class Code : int {
        SPANISH = 0,    // Español
        VALENCIAN = 1,  // Valenciano
        ENGLISH = 2     // Inglés
    };

    // --- Estructuras ---
    struct Language {
        Code code;              // Código que identifica al idioma
        std::string name;       // Nombre que identifica el idioma
        std::string file_name;  // Nombre del fichero con los textos

        Language(Code c, std::string n, std::string fn)
            : code(c),
              name(std::move(n)),
              file_name(std::move(fn)) {}
    };

    // --- Funciones ---
    auto loadFromFile(const std::string& file_path) -> bool;  // Carga los textos desde el fichero JSON especificado
    auto getText(const std::string& key) -> std::string;      // Obtiene el texto por clave
    auto getNextLangCode(Code current_lang) -> Code;          // Obtiene el código del siguiente idioma (circular)
    auto getLanguage(Code code) -> Language;                  // Obtiene el idioma correspondiente al código proporcionado
    auto getCodeFromName(const std::string& name) -> Code;    // Devuelve el código de un idioma a partir de un nombre
    auto getNameFromCode(Code code) -> std::string;           // Devuelve el nombre de un idioma a partir de un código
    void updateLanguageNames();                               // Actualiza los nombres de los idiomas
    auto getLanguageFileName(Code code) -> std::string;       // Obtiene el nombre del fichero de textos asociado a un código de idioma
    void setLanguage(Code code);                              // Establece el idioma actual
    auto getLangFile(Code code) -> std::string;               // Obtiene una fichero a partir de un Code
    auto getLangName(Code code) -> std::string;               // Obtiene una cadena a partir de un Code
}  // namespace Lang