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

const bundle = process.argv[2];
if (!bundle) {
  console.error("Please specify a bundle name (e.g., node sweep_step2.js dev)");
  process.exit(1);
}

const bundleRoot = process.env.IRIS_BUNDLE_ROOT;
if (!bundleRoot) {
  console.error("Error: Environment variable IRIS_BUNDLE_ROOT is not defined.");
  process.exit(1);
}

const bundleDir = path.join(bundleRoot, bundle);
const wikiDir = path.join(bundleDir, 'wiki');
const sourcesDir = path.join(bundleDir, 'raw_sources');
const sweepFile = path.join(bundleDir, '.bundle/sweep.md');

if (!fs.existsSync(wikiDir)) {
  console.error(`Wiki directory not found: ${wikiDir}`);
  process.exit(1);
}
if (!fs.existsSync(sourcesDir)) {
  console.error(`Sources directory not found: ${sourcesDir}`);
  process.exit(1);
}

const reservedFiles = ['index.md', 'agents.md', 'claude.md'];

// Helper to walk directory
function getAllFiles(dir, ext, fileList = []) {
  if (!fs.existsSync(dir)) return fileList;
  const files = fs.readdirSync(dir);
  files.forEach(file => {
    const filePath = path.join(dir, file);
    if (fs.statSync(filePath).isDirectory()) {
      getAllFiles(filePath, ext, fileList);
    } else if (file.endsWith(ext)) {
      fileList.push(filePath);
    }
  });
  return fileList;
}

// 1. Collect Concept IDs from wiki/
const wikiFiles = getAllFiles(wikiDir, '.md');
const wikiConcepts = [];

wikiFiles.forEach(file => {
  const relPath = path.relative(wikiDir, file).replace(/\\/g, '/');
  if (reservedFiles.includes(relPath.toLowerCase())) return;

  const conceptId = relPath.replace(/\.md$/, '').toLowerCase();
  wikiConcepts.push({
    id: conceptId,
    relPath: `wiki/${relPath}`
  });
});

// 2. Collect Concept IDs from metadata json
const metadataFiles = getAllFiles(sourcesDir, '-metadata.json');
const activeConceptIds = new Set();

metadataFiles.forEach(file => {
  try {
    const meta = JSON.parse(fs.readFileSync(file, 'utf8'));
    if (Array.isArray(meta.created_concepts)) {
      meta.created_concepts.forEach(id => {
        activeConceptIds.add(id.toLowerCase());
      });
    }
  } catch (err) {
    console.error(`Error reading metadata file ${file}:`, err);
  }
});

// 3. Find obsolete concepts (in wiki, but not in metadata)
const obsoleteConcepts = wikiConcepts.filter(c => !activeConceptIds.has(c.id));

// 4. Generate sweep.md report
const timestamp = new Date().toISOString().replace('T', ' ').substring(0, 19);
let content = `# IRIS Sweep Report (${bundle})

-   Generated At: ${timestamp}

`;

if (obsoleteConcepts.length === 0) {
  content += `## Status: CLEAN

ソースに紐づいていない孤立したコンセプトファイルは検出されませんでした。
`;
} else {
  content += `## Obsolete Concepts (孤立したコンセプトファイル一覧)

以下のコンセプトファイルは、どのソースメタデータからも参照（\`created_concepts\` に登録）されていません。これらは古い不要なファイルの可能性があります。

| Concept ID | ファイルパス | 理由 |
| :--- | :--- | :--- |
`;

  obsoleteConcepts.sort((a, b) => a.id.localeCompare(b.id)).forEach(c => {
    content += `| \`${c.id}\` | \`${c.relPath}\` | どのソースメタデータからも参照されていません。 |\n`;
  });
}

// Ensure .bundle directory exists
const bundleMetaDir = path.dirname(sweepFile);
if (!fs.existsSync(bundleMetaDir)) {
  fs.mkdirSync(bundleMetaDir, { recursive: true });
}

fs.writeFileSync(sweepFile, content, 'utf8');
console.log(`Sweep report generated successfully at: ${sweepFile}`);
console.log(`Obsolete concepts found: ${obsoleteConcepts.length}`);
