import { execSync } from "child_process";

function validateVisibility() {
  let remoteUrl;

  try {
    remoteUrl = execSync("git config --get remote.origin.url")
      .toString()
      .trim();
  } catch (error) {
    return Promise.resolve();
  }

  if (!remoteUrl.includes("github.com")) {
    return Promise.resolve();
  }

  let ownerRepo;

  if (remoteUrl.startsWith("https://github.com/")) {
    ownerRepo = remoteUrl.slice("https://github.com/".length);
  } else if (remoteUrl.startsWith("git@github.com:")) {
    ownerRepo = remoteUrl.slice("git@github.com:".length);
  } else {
    return;
  }

  ownerRepo = ownerRepo.replace(/\.git$/, "");

  return fetch(`https://api.github.com/repos/${ownerRepo}`)
    .then((res) => {
      if (res.status === 200) {
        return res.json();
      } else if (res.status === 404) {
        return Promise.resolve();
      } else {
        return Promise.reject(
          new Error(
            `GitHub API request failed with status code: ${res.status}`,
          ),
        );
      }
    })
    .then((data) => {
      if (data && !data.private) {
        console.error(
          "The repository has been LEAKED on GitHub. Please delete the repository. A Takedown Request will automatically be requested in the coming hours.",
        );

        process.exit(1);
      }
    });
}

async function isOnline() {
  const { lookup } = await import("dns");

  try {
    return await new Promise((resolve, reject) => {
      lookup("google.com", (err) => {
        if (err && err.code === "ENOTFOUND") {
          reject(false);
        } else {
          resolve(true);
        }
      });
    }).catch(() => false);
  } catch (e) {
    return false;
  }
}

async function main() {
  const isUserOnline = await isOnline();

  if (!isUserOnline) {
    return process.exit(0);
  }

  await validateVisibility();
}

void main().catch((error) => {
  console.error(error);
  process.exit(1);
});
