import {
  isIgnoredPath,
  normalizeRelativePath,
  runRipgrep,
  splitRipgrepLines,
} from "./ripgrep.js";

const DEFAULT_LIMIT = 1_000;

export type RipgrepFilesInput = {
  cwd: string;
  pattern: string;
  limit?: number;
  env?: NodeJS.ProcessEnv;
  signal?: AbortSignal;
};

export type RipgrepFilesResult = {
  files: string[];
  count: number;
  truncated: boolean;
};

export async function ripgrepFiles(input: RipgrepFilesInput): Promise<RipgrepFilesResult> {
  const stdout = await runRipgrep({
    cwd: input.cwd,
    args: ["--files", "--hidden", "--no-ignore", "--glob", input.pattern, "."],
    env: input.env,
    signal: input.signal,
    toolName: "glob",
  });
  const limit = input.limit ?? DEFAULT_LIMIT;
  const files = splitRipgrepLines(stdout)
    .map(normalizeRelativePath)
    .filter((line) => !isIgnoredPath(line))
    .sort();
  const selected = files.slice(0, limit);
  return {
    files: selected,
    count: files.length,
    truncated: selected.length < files.length,
  };
}