import { basename, join, relative, resolve } from "path";
import { analyzeTsConfig } from "ts-unused-exports";
import { containsPath, pathsEqual } from "../src/common/files";
import { exit } from "process";

function ignoreFile(file: string): boolean {
  return (
    containsPath("gulpfile.ts", file) ||
    containsPath(".storybook", file) ||
    containsPath(join("src", "stories"), file) ||
    pathsEqual(
      join("test", "vscode-tests", "jest-runner-vscode-codeql-cli.ts"),
      file,
    ) ||
    pathsEqual(join("src", "view", "jest-environment-jsdom.ts"), file) ||
    basename(file) === "jest.config.ts" ||
    basename(file) === "index.tsx" ||
    basename(file) === "index.ts" ||
    basename(file) === "playwright.config.ts"
  );
}

function main() {
  const repositoryRoot = resolve(join(__dirname, ".."));

  const result = analyzeTsConfig("tsconfig.deadcode.json");
  let foundUnusedExports = false;

  for (const [filepath, exportNameAndLocations] of Object.entries(
    result.unusedExports,
  )) {
    const relativeFilepath = relative(repositoryRoot, filepath);

    if (ignoreFile(relativeFilepath)) {
      continue;
    }

    foundUnusedExports = true;

    console.log(relativeFilepath);
    for (const exportNameAndLocation of exportNameAndLocations) {
      console.log(`    ${exportNameAndLocation.exportName}`);
    }
    console.log();
  }

  if (foundUnusedExports) {
    exit(1);
  }
}

main();
