#pragma once

#include "minecraftversion.h"

#include <QObject>
#include <QStringList>

class QProcess;

// Всё, что лаунчер знает к моменту нажатия PLAY.
struct LaunchOptions
{
    QString gameDir;            // .minecraft
    QString versionId;          // Папка в versions

    QString playerName;
    QString uuid;
    QString accessToken;
    QString userType;
    QString clientToken;

    QString javaPath;           // Пусто — ищем сами
    int minMemoryMb = 512;
    int maxMemoryMb = 4096;
    QStringList extraJvmArgs;

    int windowWidth = 0;        // 0 — не передавать --width/--height
    int windowHeight = 0;
    bool fullscreen = false;

    QString serverAddress;      // host[:port] — автозаход на сервер
    QString authlibInjectorPath;                            // Пусто — не подключаем
    QString authlibInjectorApi = QStringLiteral("ely.by");

    QString launcherName = QStringLiteral("KishkaLauncher");
    QString launcherVersion = QStringLiteral("1.0");
};

// Готовит и запускает JVM. Один экземпляр — одна игра одновременно.
class GameLauncher : public QObject
{
    Q_OBJECT

public:
    explicit GameLauncher(QObject *parent = nullptr);

    bool isRunning() const;

    // Проверяет .minecraft на комплектность. Пустой список — всё на месте.
    // Возвращает описания недостающих файлов, но не больше limit штук.
    static QStringList missingFiles(const LaunchOptions &options,
                                    const MinecraftVersion &version,
                                    int limit = 12);

    // Собирает аргументы ровно в том порядке, в котором их ждёт JVM:
    // <jvm-аргументы> <mainClass> <аргументы игры>.
    static QStringList buildArguments(const LaunchOptions &options,
                                      const MinecraftVersion &version,
                                      const QString &nativesDir);

    // Распаковывает .dll/.so/.dylib из натив-библиотек в <версия>/natives.
    static bool extractNatives(const LaunchOptions &options,
                               const MinecraftVersion &version,
                               const QString &nativesDir,
                               QString *error);

    // Полный цикл: проверка, натив-библиотеки, поиск java, старт процесса.
    bool launch(const LaunchOptions &options, const MinecraftVersion &version, QString *error);

    void terminate();

signals:
    void progress(const QString &message);
    void output(const QString &line);
    void gameStarted(const QString &commandLine);
    void gameFinished(int exitCode, bool crashed);

private:
    QProcess *m_process = nullptr;
};
