#!/usr/bin/env -S deno run -A --quiet --lock=tools/deno.lock.json
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
import { $, createOctoKit, semver } from "./deps.ts";

const currentDirPath = $.path(import.meta).parentOrThrow();

$.logStep("Getting next version...");
const nextVersion = getNextVersion(semver.parse(getCliVersion())!);

$.logStep("Creating gist with instructions...");
const octoKit = createOctoKit();
const result = await octoKit.request("POST /gists", {
  description: `Deno CLI v${nextVersion} release checklist`,
  public: false,
  files: {
    [`release_${nextVersion}.md`]: {
      content: buildDenoReleaseInstructionsDoc(),
    },
  },
});

$.log("==============================================");
$.log("Created gist with instructions!");
$.log("");
$.log(`  ${result.data.html_url}`);
$.log("");
$.log("Please fork the gist and follow the checklist.");
$.log("==============================================");

function getNextVersion(originalVersion: semver.SemVer) {
  if (Deno.args.some((a) => a === "--patch")) {
    return originalVersion.increment("patch");
  } else if (Deno.args.some((a) => a === "--minor")) {
    return originalVersion.increment("minor");
  } else if (Deno.args.some((a) => a === "--major")) {
    return originalVersion.increment("major");
  } else {
    throw new Error("Missing argument");
  }
}

function buildDenoReleaseInstructionsDoc() {
  const templateText = currentDirPath
    .join("release_doc_template.md")
    .readTextSync()
    .replaceAll("$BRANCH_NAME", `v${nextVersion.major}.${nextVersion.minor}`)
    .replaceAll("$VERSION", nextVersion.toString());
  return `# Deno CLI ${nextVersion.toString()} Release Checklist\n\n${templateText}`;
}

function getCliVersion() {
  const cargoTomlText = currentDirPath
    .join("../../cli/Cargo.toml")
    .readTextSync();
  const result = cargoTomlText.match(/^version\s*=\s*"([^"]+)"$/m);
  if (result == null || result.length !== 2) {
    $.log("Cargo.toml");
    $.log("==========");
    $.log(cargoTomlText);
    $.log("==========");
    throw new Error("Could not find version in text.");
  }
  return result[1];
}