const fs = require('fs-extra');
const path = require('path');

const CODE_FOLDER_REGEX = /^\d{3}$/;
const MAX_SCAN_DEPTH = 6;

async function buildDestinationIndex(destinationRoot, onProgress) {
  const index = new Map();

  if (!destinationRoot || !(await fs.pathExists(destinationRoot))) {
    return index;
  }

  let scanned = 0;

  async function walk(currentDir, depth) {
    if (depth > MAX_SCAN_DEPTH) {
      return;
    }

    let entries;
    try {
      entries = await fs.readdir(currentDir, { withFileTypes: true });
    } catch {
      return;
    }

    for (const entry of entries) {
      if (!entry.isDirectory()) {
        continue;
      }

      const fullPath = path.join(currentDir, entry.name);
      scanned += 1;
      onProgress?.({ phase: 'index-dest', scanned, folder: entry.name });

      if (CODE_FOLDER_REGEX.test(entry.name)) {
        const rows = index.get(entry.name) || [];
        rows.push(fullPath);
        index.set(entry.name, rows);
      }

      await walk(fullPath, depth + 1);
    }
  }

  await walk(destinationRoot, 0);
  return index;
}

module.exports = { buildDestinationIndex };
