#pragma once

#include <QDateTime>
#include <QList>
#include <QString>
#include <QUrl>

#include <optional>

// Откуда взялась сборка Java и что именно в ней лежит.
enum class JavaRuntimeKind {
    Mojang,   // «Java» — тот же рантайм, которым игру запускает официальный лаунчер
    Jdk,      // Eclipse Temurin JDK: компилятор и инструменты в комплекте
    Jre       // Eclipse Temurin JRE: только то, что нужно для запуска
};

QString javaKindKey(JavaRuntimeKind kind);          // java | jdk | jre
std::optional<JavaRuntimeKind> javaKindFromKey(const QString &key);
QString javaKindTitle(JavaRuntimeKind kind);

// Строка каталога — то, что можно скачать.
struct JavaRuntimeEntry
{
    QString id;              // temurin-jdk-21.0.12.1_1 | mojang-java-runtime-delta
    JavaRuntimeKind kind = JavaRuntimeKind::Jdk;
    int major = 0;           // 8, 17, 21…
    QString version;         // 21.0.12.1+1 | 21.0.7
    QString component;       // java-runtime-delta — только у сборок Mojang
    QDateTime released;
    QUrl url;                // архив Temurin либо manifest.json компонента
    QString checksum;        // sha256 архива Temurin, sha1 манифеста Mojang
    qint64 size = 0;         // размер загрузки, 0 — неизвестен
    QString archive;         // zip | tar.gz | mojang
    QString architecture;    // x64 | aarch64 — на macOS бывает и не родная
    bool lts = false;

    bool isValid() const { return !id.isEmpty() && major > 0 && url.isValid(); }
};

// Сборка, уже распакованная в папке лаунчера.
struct InstalledJavaRuntime
{
    QString id;
    QString kind;          // java | jdk | jre
    int major = 0;
    QString version;
    QString javaPath;      // абсолютный путь к java/java.exe
    qint64 size = 0;       // сколько заняло на диске по итогам установки
};

// Папка <root>/java: одна подпапка на сборку плюс её описание внутри. Отдельного
// индекса нет намеренно — удалённую вручную папку не пришлось бы вычищать ещё и
// из общего файла.
namespace JavaRuntimeStore {

QString dirFor(const QString &id);

// Всё, что лежит в <root>/java и на что нашлась java. Новые версии сверху.
QList<InstalledJavaRuntime> installed();
std::optional<InstalledJavaRuntime> find(const QString &id);

// Ищет bin/java в распакованном дереве: у Temurin на macOS это
// Contents/Home/bin, у Mojang — jre.bundle/Contents/Home/bin.
QString locateBinary(const QString &rootDir);

bool writeMeta(const InstalledJavaRuntime &runtime, QString *error);
bool remove(const QString &id, QString *error);

// Имя папки из идентификатора каталога: всё, кроме букв, цифр, точки, дефиса и
// подчёркивания, заменяется — идентификатор приходит из сети.
QString sanitizeId(const QString &id);

} // namespace JavaRuntimeStore

// Какая Java нужна какой версии игры. Точный ответ лежит в client.json
// (javaVersion.majorVersion) и берётся оттуда при запуске; эта таблица нужна
// раньше — когда версия ещё не скачана, а подсказку в каталоге показать надо.
namespace JavaRequirement {

// Минимальная мажорная версия Java для версии игры. 0 — разобрать не удалось.
int minimumFor(const QString &minecraftVersionId);

// «Minecraft 1.20.5 и новее» — подпись к строке каталога.
QString coverage(int javaMajor);

} // namespace JavaRequirement
