// SPDX-FileCopyrightText: 2021 Johannes Loher
//
// SPDX-License-Identifier: MIT

import fs from "fs-extra";
import semver from "semver";
import yargs from "yargs";
import { hideBin } from "yargs/helpers";

const repository = "dungeonslayers/ds4";
const gitlabURL = "https://git.f3l.de";

const getLicenseURL = (version) => `${gitlabURL}/${repository}/-/raw/${version}/LICENSE.md`;
const getReadmeURL = (version) => `${gitlabURL}/${repository}/-/raw/${version}/README.md`;
const getChangelogURL = (version) => `${gitlabURL}/${repository}/-/releases/v${version}`;
const getDownloadURL = (version) => `${gitlabURL}/${repository}/-/releases/v${version}/downloads/system.zip`;

const manifestPath = "./system.json";

/**
 * Get the contents of the manifest file as object.
 * @returns {unknown} An object describing the manifest
 */
function getManifest() {
    if (fs.existsSync(manifestPath)) {
        return fs.readJSONSync(manifestPath);
    }
}

/**
 * Get the target version based on on the current version and the argument passed as release.
 * @param {string} currentVersion The current version
 * @param {semver.ReleaseType | string} release Either a semver release type or a valid semver version
 * @returns {string | null} The target version
 */
function getTargetVersion(currentVersion, release) {
    if (["major", "premajor", "minor", "preminor", "patch", "prepatch", "prerelease"].includes(release)) {
        return semver.inc(currentVersion, release);
    } else {
        return semver.valid(release);
    }
}

/**
 * Update version and download URL.
 * @param {semver.ReleaseType | string} release Either a semver release type or a valid semver version
 */
function bumpVersion(release) {
    if (!release) {
        throw new Error("Missing release type");
    }

    const packageJson = fs.readJSONSync("package.json");
    const manifest = getManifest();
    if (!manifest) throw new Error("Manifest JSON not found");

    const currentVersion = packageJson.version;
    const targetVersion = getTargetVersion(currentVersion, release);

    if (!targetVersion) {
        throw new Error("Incorrect version arguments");
    }
    if (targetVersion === currentVersion) {
        throw new Error("Target version is identical to current version");
    }

    console.log(`Bumping version number to '${targetVersion}'`);
    packageJson.version = targetVersion;
    fs.writeJSONSync("package.json", packageJson, { spaces: 4 });
    manifest.license = getLicenseURL(targetVersion);
    manifest.readme = getReadmeURL(targetVersion);
    manifest.changelog = getChangelogURL(targetVersion);
    manifest.version = targetVersion;
    manifest.download = getDownloadURL(targetVersion);
    fs.writeJSONSync(manifestPath, manifest, { spaces: 4 });
}

const argv = yargs(hideBin(process.argv)).usage("Usage: $0").option("release", {
    alias: "r",
    type: "string",
    demandOption: true,
    description: "Either a semver release type or a valid semver version",
}).argv;
const release = argv.r;
bumpVersion(release);