#!/usr/bin/env node

/**
 * whats-active CLI — produce a read-only inventory of everything Claude Code
 * loads for a given repo path. Thin shim over scanners/lib/active-config-reader.mjs.
 *
 * Usage:
 *   node whats-active.mjs [path] [--json] [--output-file <path>]
 *                                 [--verbose] [--suggest-disables]
 *
 * Exit codes: 0=ok, 3=unrecoverable error.
 * Zero external dependencies.
 */

import { resolve } from 'node:path';
import { writeFile, stat } from 'node:fs/promises';
import { readActiveConfig } from './lib/active-config-reader.mjs';

async function main() {
  const args = process.argv.slice(2);
  let targetPath = '.';
  let outputFile = null;
  let jsonMode = false;
  // --raw is accepted for CLI surface consistency but is a no-op here:
  // whats-active produces an inventory snapshot, not findings.
  let rawMode = false;
  let verbose = false;
  let suggestDisables = false;

  for (let i = 0; i < args.length; i++) {
    if (args[i] === '--json') jsonMode = true;
    else if (args[i] === '--raw') rawMode = true;
    else if (args[i] === '--verbose') verbose = true;
    else if (args[i] === '--suggest-disables') suggestDisables = true;
    else if (args[i] === '--output-file' && args[i + 1]) outputFile = args[++i];
    else if (!args[i].startsWith('-')) targetPath = args[i];
  }

  const absPath = resolve(targetPath);
  try {
    const s = await stat(absPath);
    if (!s.isDirectory()) {
      process.stderr.write(`Error: ${absPath} is not a directory\n`);
      process.exit(3);
    }
  } catch {
    process.stderr.write(`Error: path does not exist: ${absPath}\n`);
    process.exit(3);
  }

  const result = await readActiveConfig(absPath, { verbose, suggestDisables });
  const json = JSON.stringify(result, null, 2);

  if (outputFile) {
    await writeFile(outputFile, json, 'utf-8');
  }

  if (jsonMode || rawMode || !outputFile) {
    process.stdout.write(json + '\n');
  }
}

const isDirectRun = process.argv[1] && resolve(process.argv[1]) === resolve(new URL(import.meta.url).pathname);
if (isDirectRun) {
  main().catch(err => {
    process.stderr.write(`Fatal: ${err.message}\n`);
    process.exit(3);
  });
}
