import { Command } from 'commander';
import { describe, expect, it } from 'vitest';

import { registerForgeCommand } from './cli.js';

describe('registerForgeCommand', () => {
  it('registers a "forge" command on the parent program', () => {
    const program = new Command();
    registerForgeCommand(program);

    const forgeCmd = program.commands.find((c) => c.name() === 'forge');
    expect(forgeCmd).toBeDefined();
  });

  it('registers the four required subcommands under forge', () => {
    const program = new Command();
    registerForgeCommand(program);

    const forgeCmd = program.commands.find((c) => c.name() === 'forge');
    expect(forgeCmd).toBeDefined();

    const subNames = forgeCmd!.commands.map((c) => c.name());

    expect(subNames).toContain('run');
    expect(subNames).toContain('status');
    expect(subNames).toContain('resume');
    expect(subNames).toContain('personas');
  });

  it('registers "personas list" as a subcommand of "forge personas"', () => {
    const program = new Command();
    registerForgeCommand(program);

    const forgeCmd = program.commands.find((c) => c.name() === 'forge');
    const personasCmd = forgeCmd!.commands.find((c) => c.name() === 'personas');
    expect(personasCmd).toBeDefined();

    const personasSubNames = personasCmd!.commands.map((c) => c.name());
    expect(personasSubNames).toContain('list');
  });

  it('does not modify the parent program name or description', () => {
    const program = new Command('mosaic');
    program.description('Mosaic Stack CLI');
    registerForgeCommand(program);

    expect(program.name()).toBe('mosaic');
    expect(program.description()).toBe('Mosaic Stack CLI');
  });

  it('can be called multiple times without throwing', () => {
    const program = new Command();
    expect(() => {
      registerForgeCommand(program);
    }).not.toThrow();
  });
});
