#include "launcherpaths.h"

#include <QCoreApplication>
#include <QDir>
#include <QFileInfo>

namespace {

const QString kFolderName = QStringLiteral("galeonLauncher");

QString translate(const char *text)
{
    return QCoreApplication::translate("LauncherPaths", text);
}

} // namespace

QString LauncherPaths::containerDir()
{
#if defined(Q_OS_WIN)
    return QDir::homePath() + QStringLiteral("/AppData/Roaming");
#elif defined(Q_OS_MACOS)
    return QDir::homePath() + QStringLiteral("/Library/Application Support");
#else // Linux и прочие Unix-системы
    return QDir::homePath();
#endif
}

QString LauncherPaths::rootDir()
{
    return containerDir() + u'/' + kFolderName;
}

QString LauncherPaths::defaultMinecraftDir()
{
#if defined(Q_OS_MACOS)
    // На macOS папка игры исторически без точки.
    return containerDir() + QStringLiteral("/minecraft");
#else
    return containerDir() + QStringLiteral("/.minecraft");
#endif
}

QString LauncherPaths::settingsFile()
{
    return rootDir() + QStringLiteral("/settings.json");
}

QString LauncherPaths::profilesFile()
{
    return rootDir() + QStringLiteral("/profiles.json");
}

QString LauncherPaths::customBuildsFile()
{
    return rootDir() + QStringLiteral("/customBuilds.json");
}

QString LauncherPaths::legacyCustomBuildsFile()
{
    return rootDir() + QStringLiteral("/versions.json");
}

QString LauncherPaths::buildStorageDir()
{
    return rootDir() + QStringLiteral("/builds");
}

QString LauncherPaths::runtimeDir()
{
    return rootDir() + QStringLiteral("/runtime");
}

QString LauncherPaths::javaDir()
{
    return rootDir() + QStringLiteral("/java");
}

QString LauncherPaths::javaCatalogFile()
{
    return cacheDir() + QStringLiteral("/java_runtimes.json");
}

QString LauncherPaths::javaDownloadDir()
{
    return cacheDir() + QStringLiteral("/java");
}

QString LauncherPaths::cacheDir()
{
    return rootDir() + QStringLiteral("/cache");
}

QString LauncherPaths::versionManifestFile()
{
    return cacheDir() + QStringLiteral("/version_manifest.json");
}

QString LauncherPaths::loaderCacheFile(const QString &loaderKey)
{
    return cacheDir() + QStringLiteral("/loader_") + loaderKey + QStringLiteral(".json");
}

QString LauncherPaths::loaderDownloadDir()
{
    return cacheDir() + QStringLiteral("/loaders");
}

bool LauncherPaths::ensureRootExists(QString *error)
{
    const QStringList required{rootDir(),        runtimeDir(),      cacheDir(),
                               loaderDownloadDir(), buildStorageDir(), javaDir(),
                               javaDownloadDir()};
    for (const QString &path : required) {
        if (!QDir().mkpath(path)) {
            if (error)
                *error = translate("не удалось создать %1").arg(QDir::toNativeSeparators(path));
            return false;
        }

        // mkpath отвечает true и для существующего каталога, в который нельзя писать,
        // и для подсунутого вместо папки файла — тогда все сохранения провалились бы молча.
        const QFileInfo info(path);
        if (!info.isDir() || !info.isWritable()) {
            if (error)
                *error = translate("нет доступа на запись в %1").arg(QDir::toNativeSeparators(path));
            return false;
        }
    }
    return true;
}
