#pragma once

#include <QString>
#include <QUrl>

#include <optional>

// Модлоадеры, которые лаунчер умеет ставить. Взаимоисключающи: игра
// запускается ровно с одним профилем в <gameDir>/versions.
enum class ModLoader { Forge, Fabric, NeoForge, Quilt };

// Одна сборка модлоадера под конкретную версию игры.
struct LoaderVersionEntry
{
    QString loaderVersion;   // 47.4.0 | 0.19.3 | 21.1.248
    QString gameVersion;     // 1.20.1
    QString versionId;       // предсказанный versions/<id>; у Forge пусто —
                             // он выясняется после работы установщика
    QUrl installerUrl;       // только Forge и NeoForge
    bool recommended = false;
    bool stable = true;
};

// Ключ для интерфейса, кэша на диске и поля loader в customBuilds.json.
inline QString loaderKey(ModLoader loader)
{
    switch (loader) {
    case ModLoader::Forge:    return QStringLiteral("forge");
    case ModLoader::Fabric:   return QStringLiteral("fabric");
    case ModLoader::NeoForge: return QStringLiteral("neoforge");
    case ModLoader::Quilt:    return QStringLiteral("quilt");
    }
    return {};
}

inline QString loaderTitle(ModLoader loader)
{
    switch (loader) {
    case ModLoader::Forge:    return QStringLiteral("Minecraft Forge");
    case ModLoader::Fabric:   return QStringLiteral("Fabric Loader");
    case ModLoader::NeoForge: return QStringLiteral("NeoForge");
    case ModLoader::Quilt:    return QStringLiteral("Quilt Loader");
    }
    return {};
}

inline std::optional<ModLoader> loaderFromKey(const QString &key)
{
    if (key == QLatin1String("forge"))    return ModLoader::Forge;
    if (key == QLatin1String("fabric"))   return ModLoader::Fabric;
    if (key == QLatin1String("neoforge")) return ModLoader::NeoForge;
    if (key == QLatin1String("quilt"))    return ModLoader::Quilt;
    return std::nullopt;
}
