const core = require('@actions/core');
const github = require('@actions/github');

const TRIGGER = "@bazel-io ";
const FLAGGED_LABEL = "potential release blocker";

async function run() {
  const token = core.getInput("token");
  const octokit = github.getOctokit(token);

  const payload = github.context.payload;
  if (!payload.comment.body.startsWith(TRIGGER)) return;
  const command = payload.comment.body.slice(TRIGGER.length);

  const owner = payload.repository.owner.login;
  const repo = payload.repository.name;

  if (command.startsWith("fork ")) {
    // Check if the commenter is a collaborator of the repo
    try {
      await octokit.rest.repos.checkCollaborator({
        owner,
        repo,
        username: payload.comment.user.login,
      });
    } catch (err) {
      await octokit.rest.reactions.createForIssueComment({
        owner,
        repo,
        comment_id: payload.comment.id,
        content: '-1',
      });
      throw `user ${payload.comment.user.login} has no collaborator access in repo ${owner}/${repo}`;
    }

    // Find the milestone corresponding to this branch
    const branch = command.slice(5).trim();
    let milestoneNumber = null;
    for await (const { data: milestones } of octokit.paginate.iterator(
      octokit.rest.issues.listMilestones,
      {owner, repo}
    )) {
      let milestone = milestones.find(m => m.title === `${branch} release blockers`);
      if (milestone) {
        milestoneNumber = milestone.number;
        break;
      }
    }
    if (milestoneNumber === null) {
      await octokit.rest.reactions.createForIssueComment({
        owner,
        repo,
        comment_id: payload.comment.id,
        content: 'confused',
      });
      throw `no release blocker milestone found for ${branch}`;
    }

    // Create an issue on this milestone
    await octokit.rest.issues.create({
      owner,
      repo,
      title: `[${branch}] ` + payload.issue.title,
      body: `Forked from #${payload.issue.number}`,
      milestone: milestoneNumber,
    });

    // Remove the "potential release blocker" label if it's present
    if (payload.issue.labels.some(label => label.name === FLAGGED_LABEL)) {
      await octokit.rest.issues.removeLabel({
        owner,
        repo,
        issue_number: payload.issue.number,
        name: FLAGGED_LABEL,
      });
    }
  } else if (command === "flag" || command.startsWith("flag ")) {
    await octokit.rest.issues.addLabels({
      owner,
      repo,
      issue_number: payload.issue.number,
      labels: [FLAGGED_LABEL],
    });
  } else {
    await octokit.rest.reactions.createForIssueComment({
      owner,
      repo,
      comment_id: payload.comment.id,
      content: 'confused',
    });
    throw `unrecognized command: ${command}`;
  }

  await octokit.rest.reactions.createForIssueComment({
    owner,
    repo,
    comment_id: payload.comment.id,
    content: '+1',
  });
}

run().catch(err => { core.setFailed(err); });
