import * as cp from "child_process";
import fetch from "node-fetch";

import checks from "./checks";

const [owner, repo] = process.env.GITHUB_REPOSITORY.split("/");

function getCurrentCommitSha() {
  return cp
    .execSync("git rev-parse HEAD")
    .toString()
    .trim();
}
// The SHA provied by GITHUB_SHA is the merge (PR) commit.
// We need to get the current commit sha ourself.
const sha = getCurrentCommitSha();

async function setStatus(context: any, state: string, description: string) {
  return fetch(
    `https://api.github.com/repos/${owner}/${repo}/statuses/${sha}`,
    {
      method: "POST",
      body: JSON.stringify({
        state,
        description,
        context,
      }),
      headers: {
        Authorization: `Bearer ${process.env.GITHUB_TOKEN}`,
        "Content-Type": "application/json",
      },
    }
  );
}

(async () => {
  console.log(`Starting status checks for commit ${sha}`);
  // Run in parallel
  await Promise.all(
    checks.map(async (check: { name: any; callback: any }) => {
      const { name, callback } = check;

      await setStatus(name, "pending", "Running check..");

      try {
        const response = await callback();
        await setStatus(name, "success", response);
      } catch (err) {
        const message = err ? err.message : "Something went wrong";
        await setStatus(name, "failure", message);
      }
    })
  );

  console.log("Finished status checks");
})();