/**
 * Servicio: fsScanner
 *
 * Este módulo proporciona la función `scanDirectory` que recorre recursivamente
 * un directorio (ignorando archivos y carpetas que comienzan por `.`) y devuelve
 * una lista de metadatos de ficheros encontrados. Cada entrada contiene el
 * `path` completo, `filename`, `name`, `size`, `format` detectado por extensión
 * y `isArchive` indicando si se trata de un contenedor (zip/7z/chd).
 *
 * Se usa desde el importService para listar las ROMs/archivos que deben ser
 * procesados/hashed y persistidos.
 */
import path from 'path';
import { promises as fsPromises } from 'fs';
import { detectFormat } from '../lib/fileTypeDetector';

export async function scanDirectory(dirPath: string): Promise<any[]> {
  const results: any[] = [];

  async function walk(dir: string) {
    const entries = await fsPromises.readdir(dir, { withFileTypes: true });

    for (const entry of entries) {
      if (entry.name.startsWith('.')) continue; // ignore dotfiles

      const full = path.join(dir, entry.name);

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

      if (entry.isFile()) {
        const stat = await fsPromises.stat(full);
        const format = detectFormat(entry.name);
        const isArchive = ['zip', '7z', 'chd'].includes(format);

        results.push({
          path: full,
          filename: entry.name,
          name: entry.name,
          size: stat.size,
          format,
          isArchive,
        });
      }
    }
  }

  await walk(dirPath);
  return results;
}

export default scanDirectory;
