var http = require("http");
var createHandler = require("github-webhook-handler");
var handler = createHandler({ path: "/webhook", secret: process.env.SECRET });

var userArray = ["user1"];

var teamDescription = "Team of Robots";
var teamPrivacy = "closed"; // closed (visible) / secret (hidden) are options here

var teamName = process.env.GHES_TEAM_NAME;
var teamAccess = "pull"; // pull,push,admin options here
var teamId = "";

var orgRepos = [];

// var creator = ""

http
  .createServer(function (req, res) {
    handler(req, res, function (err) {
      console.log(err);
      res.statusCode = 404;
      res.end("no such location");
    });
  })
  .listen(3000);

handler.on("error", function (err) {
  console.error("Error:", err.message);
});

handler.on("repository", function (event) {
  if (event.payload.action === "created") {
    const repo = event.payload.repository.full_name;
    console.log(repo);
    const org = event.payload.repository.owner.login;
    getTeamID(org);
    setTimeout(checkTeamIDVariable, 1000);
  }
});

handler.on("team", function (event) {
  // TODO user events such as being removed from team or org
  if (event.payload.action === "deleted") {
    // const name = event.payload.team.name
    const org = event.payload.organization.login;
    getRepositories(org);
    setTimeout(checkReposVariable, 5000);
  } else if (event.payload.action === "removed_from_repository") {
    const org = event.payload.organization.login;
    getTeamID(org);
    // const repo = event.payload.repository.full_name
    setTimeout(checkTeamIDVariable, 1000);
  }
});

function getTeamID(org) {
  const https = require("https");

  const options = {
    hostname: process.env.GHE_HOST,
    port: 443,
    path: "/api/v3/orgs/" + org + "/teams",
    method: "GET",
    headers: {
      Authorization: "token " + process.env.GHE_TOKEN,
      "Content-Type": "application/json",
    },
  };
  let body = [];
  const req = https.request(options, (res) => {
    res
      .on("data", (chunk) => {
        body.push(chunk);
      })
      .on("end", () => {
        body = JSON.parse(Buffer.concat(body));
        body.forEach((item) => {
          if (item.name === teamName) {
            teamId = item.id;
          }
        });
      });
  });

  req.on("error", (error) => {
    console.error(error);
  });

  req.end();
}

function checkTeamIDVariable(repo) {
  if (typeof teamId !== "undefined") {
    addTeamToRepo(repo, teamId);
  }
}

function checkReposVariable(org) {
  if (typeof orgRepos !== "undefined") {
    //      for(var repo of orgRepos) {
    //        addTeamToRepo(repo, teamId)
    // }
    reCreateTeam(org);
  }
}

function addTeamToRepo(repo, teamId) {
  const https = require("https");
  const data = JSON.stringify({
    permission: teamAccess,
  });

  const options = {
    hostname: process.env.GHE_HOST,
    port: 443,
    path: "/api/v3/teams/" + teamId + "/repos/" + repo,
    method: "PUT",
    headers: {
      Authorization: "token " + process.env.GHE_TOKEN,
      "Content-Type": "application/json",
      "Content-Length": data.length,
    },
  };
  let body = [];
  const req = https.request(options, (res) => {
    res
      .on("data", (chunk) => {
        body.push(chunk);
      })
      .on("end", () => {
        body = Buffer.concat(body).toString();
        console.log(res.statusCode);
        console.log("added team to " + repo);
      });
  });

  req.on("error", (error) => {
    console.error(error);
  });

  req.write(data);
  req.end();
}

function reCreateTeam(org) {
  const https = require("https");
  const data = JSON.stringify({
    name: teamName,
    description: teamDescription,
    privacy: teamPrivacy,
    maintainers: userArray,
    repo_names: orgRepos,
  });

  const options = {
    hostname: process.env.GHE_HOST,
    port: 443,
    path: "/api/v3/orgs/" + org + "/teams",
    method: "POST",
    headers: {
      Authorization: "token " + process.env.GHE_TOKEN,
      "Content-Type": "application/json",
      "Content-Length": data.length,
    },
  };
  // const body = []
  const req = https.request(options, (res) => {
    if (res.statusCode !== 201) {
      console.log("Status code: " + res.statusCode);
      console.log("Added " + teamName + " to " + org + " Failed");
      res.on("data", function (chunk) {
        console.log("BODY: " + chunk);
      });
    } else {
      console.log("Added " + teamName + " to " + org);
    }
  });

  req.on("error", (error) => {
    console.error(error);
  });

  req.write(data);
  req.end();
}

function getRepositories(org) {
  orgRepos = [];

  const https = require("https");

  const options = {
    hostname: process.env.GHE_HOST,
    port: 443,
    path: "/api/v3/orgs/" + org + "/repos",
    method: "GET",
    headers: {
      Authorization: "token " + process.env.GHE_TOKEN,
      "Content-Type": "application/json",
    },
  };
  let body = [];
  const req = https.request(options, (res) => {
    res
      .on("data", (chunk) => {
        body.push(chunk);
      })
      .on("end", () => {
        body = JSON.parse(Buffer.concat(body));
        body.forEach((item) => {
          orgRepos.push(item.full_name);
          console.log(item.full_name);
        });
      });
  });

  req.on("error", (error) => {
    console.error(error);
  });

  req.end();
}