import ignore from 'ignore';
import { existsSync, readFileSync } from 'fs';
import { logger } from './logger';
import { AAI_IGNORE_FILENAME } from '../constants';
import { Spawner } from './spawner';
import { join } from 'path';

function createIgnoreObject(rules: string[]) {
  return ignore().add(rules);
}

export function parseAaiIgnoreToArray(path?: string) {
  const aaiIgnorePath = path ?? AAI_IGNORE_FILENAME;
  if (!existsSync(aaiIgnorePath)) {
    logger.info(`${aaiIgnorePath} not found.`);
    return [];
  }

  return readFileSync(aaiIgnorePath, 'utf-8')
    .split('\n')
    .filter((line) => {
      const trimmed = line.trim();
      return trimmed && !trimmed.startsWith('#');
    })
    .map((line) => line.trim());
}

export async function getFilteredFileNames(source: Spawner, ignore: string[]) {
  const allFileNames = await source.walk();
  const aaiIgnoreRules = parseAaiIgnoreToArray();
  const ignoreChecker = createIgnoreObject(aaiIgnoreRules.concat(ignore));
  return allFileNames.filter((file) => !ignoreChecker.ignores(join(file)));
}
