/**
 * File discovery: walk directory tree, find Java source files.
 */

import { readdirSync, statSync } from "node:fs";
import { join, resolve } from "node:path";

const JAVA_EXTENSION = ".java";
const BINARY_EXTENSIONS = new Set([
  ".class", ".jar", ".war", ".ear", ".zip", ".gz", ".tar",
  ".png", ".jpg", ".gif", ".ico", ".pdf",
]);

export function discoverJavaFiles(
  root: string,
  maxFileSizeKb = 5000,
): string[] {
  const resolved = resolve(root);
  const maxBytes = maxFileSizeKb * 1024;
  const javaFiles: string[] = [];
  let skipped = 0;

  function walk(dir: string): void {
    let entries;
    try {
      entries = readdirSync(dir, { withFileTypes: true });
    } catch {
      return;
    }
    for (const entry of entries) {
      if (entry.name.startsWith(".")) continue;
      const full = join(dir, entry.name);

      if (entry.isDirectory()) {
        walk(full);
        continue;
      }

      if (!entry.name.endsWith(JAVA_EXTENSION)) continue;

      const ext = entry.name.substring(entry.name.lastIndexOf(".")).toLowerCase();
      if (BINARY_EXTENSIONS.has(ext)) continue;

      try {
        const size = statSync(full).size;
        if (size > maxBytes) {
          console.warn(
            `[scan.file.skipped_size] ${full} (${Math.floor(size / 1024)}KB > ${maxFileSizeKb}KB)`,
          );
          skipped++;
          continue;
        }
      } catch {
        skipped++;
        continue;
      }

      javaFiles.push(full);
    }
  }

  walk(resolved);

  console.log(
    `[scan.discovery] root=${resolved} found=${javaFiles.length} skipped=${skipped}`,
  );
  return javaFiles.sort();
}
