#pragma once

#include <QJsonArray>
#include <QList>
#include <QSet>
#include <QString>
#include <QStringList>

// Одна библиотека из client.json уже с разрешёнными правилами.
struct MinecraftLibrary
{
    QString name;                 // Maven-координаты: org.lwjgl:lwjgl:3.3.1:natives-windows
    QString path;                 // Путь относительно .minecraft/libraries
    QString url;                  // Откуда качать, если файла нет (может быть пустым)
    QString sha1;
    qint64 size = 0;
    bool native = false;          // Распаковывается в natives, а не кладётся в classpath
    QStringList extractExclude;   // Префиксы, которые не распаковываем
};

// client.json, «схлопнутый» по всей цепочке inheritsFrom.
struct MinecraftVersion
{
    QString id;                   // Имя папки в versions, оно же --version
    QString mainClass;
    QString type;                 // release / snapshot / modified — идёт в --versionType
    QString assetIndexId;         // --assetIndex
    QString assetsKind;           // Поле "assets": legacy, pre-1.6 либо тот же id
    QString clientJarPath;        // Абсолютный путь к <id>.jar (может лежать у родителя)
    int javaMajor = 8;

    QStringList jvmArgs;          // Ещё с неподставленными ${...}
    QStringList gameArgs;
    QList<MinecraftLibrary> libraries;

    QString loggingArgument;      // -Dlog4j.configurationFile=${path}
    QString loggingConfigPath;    // Абсолютный путь к xml, пустой если конфига нет

    bool supportsQuickPlay = false;   // 1.20+ понимает --quickPlayMultiplayer
    bool hasCustomResolutionArgs = false;

    bool isValid() const { return !id.isEmpty() && !mainClass.isEmpty(); }
};

namespace VersionLoader {

// Версии, реально установленные в <gameDir>/versions (есть папка и <id>.json).
QStringList installedVersions(const QString &gameDir);

// Установленные профили, у которых inheritsFrom == versionId: без базовой версии
// они не запустятся.
QStringList dependentsOf(const QString &gameDir, const QString &versionId);

// Размер <gameDir>/versions/<id> в байтах; 0 — папки нет.
qint64 installedSize(const QString &gameDir, const QString &versionId);

// Сносит <gameDir>/versions/<id>. Отсутствие папки — успех.
bool remove(const QString &gameDir, const QString &versionId, QString *error);

// Читает и разворачивает версию. При ошибке возвращает невалидный объект и пишет error.
MinecraftVersion load(const QString &gameDir,
                      const QString &versionId,
                      const QSet<QString> &features,
                      QString *error);

// Стандартный алгоритм Mojang: правила применяются по порядку, побеждает последнее совпавшее.
bool rulesAllow(const QJsonArray &rules, const QSet<QString> &features = {});

// natives-windows / natives-macos-arm64 / natives-linux ... для текущей машины.
QString nativeClassifier();

QString osName();
QString osArch();

} // namespace VersionLoader
