#!/usr/bin/env node
/**
 * cli:efcore-list — List EF Core migrations for a worktree.
 *
 * Usage:
 *   npx tsx skills/efcore/cli/list/index.ts --spec '{"cwd":"D:/path/to/worktree"}'
 */
import { parseArgs } from 'node:util';
import { existsSync, readFileSync } from 'node:fs';
import { validate } from './validate.js';
import { execute } from './execute.js';

async function main(): Promise<void> {
  const { values } = parseArgs({
    options: {
      spec: { type: 'string' },
      help: { type: 'boolean', short: 'h' },
    },
  });

  if (values.help || !values.spec) {
    printHelp();
    process.exit(values.help ? 0 : 1);
  }

  let raw: unknown;
  try {
    raw = existsSync(values.spec!) ? JSON.parse(readFileSync(values.spec!, 'utf-8')) : JSON.parse(values.spec!);
  } catch (err) {
    console.log(JSON.stringify({ success: false, error: `Invalid JSON spec: ${(err as Error).message}` }, null, 2));
    process.exit(1);
  }

  const validation = validate(raw);
  if (!validation.valid || !validation.data) {
    console.log(JSON.stringify({ success: false, errors: validation.blockers, warnings: validation.warnings }, null, 2));
    process.exit(1);
  }

  const result = await execute(validation.data);
  console.log(JSON.stringify(result, null, 2));
  process.exit(result.success ? 0 : 1);
}

function printHelp(): void {
  console.log(`
cli:efcore-list — SmartStack Studio

Lists EF Core migrations in a worktree, grouped by DbContext and migration
assembly. Applied + pending status per migration.

Usage:
  npx tsx skills/efcore/cli/list/index.ts --spec '<json>'

Spec:
  { "cwd": "<worktree path>", "contextName"?: "<name>", "assembly"?: "<name>" }
`);
}

void main();
