#!/usr/bin/env node
/**
 * cli:efcore-create — Scaffold a new EF Core migration with automatic naming.
 *
 * Naming convention (no MCP): {contextPrefix}_v{version_underscore}_{seq3}_{PascalCaseDescription}
 *
 * Usage:
 *   npx --prefer-offline tsx skills/efcore/cli/create/index.ts --spec '{
 *     "cwd": "D:/path/to/worktree",
 *     "contextName": "CoreDbContext",
 *     "description": "AddEmployeeAvatar"
 *   }'
 */
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) {
    console.log(`Usage: npx --prefer-offline tsx skills/efcore/cli/create/index.ts --spec '{"cwd":"...","contextName":"CoreDbContext","description":"AddFoo"}'`);
    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, errors: [`Invalid JSON: ${(err as Error).message}`], warnings: [] }, 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);
}

void main();
