const fs = require("node:fs");
const YAML = require("yaml");

const ciFilepath = ".github/workflows/ci.yml";
const envFilepath = "src/env.mjs";

const ignoreEnvs = ["NODE_ENV", "SKIP_ENV_VALIDATION"];

// ANSI escape codes for colors
const colors = {
  red: "\x1b[31m%s\x1b[0m",
  green: "\x1b[32m%s\x1b[0m",
  yellow: "\x1b[33m%s\x1b[0m",
};

console.log();
console.log(colors.yellow, "Environment variables checker:");
// Read CI file content
try {
  const ciContent = fs.readFileSync(ciFilepath, "utf8");
  const ciData = YAML.parse(ciContent);

  // Read env file content
  const envContent = fs.readFileSync(envFilepath, "utf8");
  const envRegex = /process\.env\.([A-Z_0-9]+)/g;
  const declaredEnvs = [];

  let match = envRegex.exec(envContent);
  while (match !== null) {
    declaredEnvs.push(match[1]);
    match = envRegex.exec(envContent); // Re-assign at the end of the loop
  }

  // Remove ignored environment variables from the list of declared environment variables
  const filteredEnvs = declaredEnvs.filter((env) => !ignoreEnvs.includes(env));

  // Check for missing env variables in CI file
  const missingEnvs = filteredEnvs.filter((env) => !ciData.env[env]);

  if (missingEnvs.length > 0) {
    console.error(
      colors.red,
      `Missing environment variables in ${ciFilepath}: ${missingEnvs.join(", ")}`,
    );
  } else {
    console.log(colors.green, "No missing environment variables found.");
  }
} catch (error) {
  console.error(colors.red, `Error processing files: ${error.message}`);
}
