#!/usr/bin/env node
const run = require("../index");
(async function () {
  const log = require("debug")("ghdb");
  const { argv } = require("yargs")
    .options({
      pat: { type: "string", description: "GitHub API Token" },
      repo: {
        type: "string",
        description: "The repo to update (format: user/repo)",
      },
      user: {
        type: "string",
        description:
          "Update all repos owned by the provided user (example: my-user)",
      },
      org: {
        type: "string",
        description:
          "Update all repos in the provided org (example: my-org-name)",
      },
      team: {
        type: "string",
        description:
          "Update all repos in the provided team (example: my-team-name), only usable in combination with org parameter",
      },
      "dry-run": {
        type: "boolean",
        default: false,
        description: "Output log messages only. Do not make any changes",
      },
      "list-repos-only": {
        type: "boolean",
        default: false,
        description: "List repos that would be affected, then exit",
      },
      "skip-forks": {
        type: "boolean",
        default: false,
        description: "Skips forked repositories",
      },
      old: {
        type: "string",
        default: "master",
        description: "The name of the branch to rename",
      },
      new: {
        type: "string",
        default: "main",
        description: "The new branch name",
      },
      confirm: {
        type: "boolean",
        default: false,
        description: "Run without prompting for confirmation",
      },
      "base-url": {
        type: "string",
        description:
          "Set a custom API base URL for use with GitHub Enterprise (example: https://github.example.com/api/v3)",
      },
      // Plugin needed to use the old /git/refs/ API instead of the newer
      // /git/ref/ API introduced in v2.19.
      // https://developer.github.com/enterprise/2.18/v3/git/refs/
      // https://developer.github.com/enterprise/2.19/v3/git/refs/
      "enterprise-compatibility": {
        type: "boolean",
        default: false,
        description:
          "Load Octokit plugin for improving compatibility with older versions of GitHub Enterprise API (needed for GitHub Enterprise versions before v2.19)",
      },
    })
    .example([
      ["$0 --pat <token> --repo user/repo", "Rename master to main"],
      [
        "$0 --pat <token> --repo user/repo --old dev --new develop",
        "Rename dev to develop",
      ],
      [
        "$0 --pat <token> --org my-org-name",
        "Rename all repos owned by an org",
      ],
      [
        "$0 --pat <token> --org my-org-name --team my-team-slug",
        "Rename all repos owned by a team within an org",
      ],
      ["$0 --pat <token> --user my-user", "Rename all repos owned by a user"],
    ]);

  const isDryRun = !!argv.dryRun;

  // Up front validation
  const providedRepoSelectors = [argv.org, argv.user, argv.repo].filter(
    (v) => v
  ).length;

  if (providedRepoSelectors === 0) {
    console.error("❎ You must provide --org, --user or --repo");
    return;
  }

  if (providedRepoSelectors > 1) {
    console.error("❎ Only --org OR --user OR --repo is supported");
    return;
  }

  if (!argv.pat && !process.env.GITHUB_TOKEN) {
    console.error(
      "❎ Provide a GitHub Access Token using --pat <token> or using the GITHUB_TOKEN environment variable"
    );
    return;
  }

  const confirmation = require("../src/confirmation");

  const old = argv.old || "master";
  const target = argv.new || "main";

  // Make sure they want to do this
  if (!(await confirmation(argv.confirm, old, target))) {
    return;
  }

  await run(argv);

  log("Complete");
})();
