import { describe, it, expect } from 'vitest';
import { extractPlaceholders } from '../src/extractPlaceholders';

describe('extractPlaceholders', () => {
  it('extracts @cmd placeholders', () => {
    const content = `
      @cmd[echo "hello"]
      Some text
      @cmd[ls -la]
    `;
    const placeholders = extractPlaceholders(content);
    expect(placeholders).toHaveLength(2);
    expect(placeholders[0]).toMatchObject({
      type: 'cmd',
      command: 'echo "hello"',
      lineNumber: 2
    });
    expect(placeholders[1]).toMatchObject({
      type: 'cmd',
      command: 'ls -la',
      lineNumber: 4
    });
  });

  it('extracts @import placeholders for markdown headings', () => {
    const content = `
      @import[../docs/setup.md # Installation]
      @import[../docs/api.md # Endpoints] as ###
      @import[../docs/guide.md # Setup] as ### Quick Start
    `;
    const placeholders = extractPlaceholders(content);
    expect(placeholders).toHaveLength(3);
    
    expect(placeholders[0]).toMatchObject({
      type: 'import',
      importPath: '../docs/setup.md',
      heading: 'Installation',
      lineNumber: 2
    });

    expect(placeholders[1]).toMatchObject({
      type: 'import',
      importPath: '../docs/api.md',
      heading: 'Endpoints',
      headingLevelOverride: '###',
      lineNumber: 3
    });

    expect(placeholders[2]).toMatchObject({
      type: 'import',
      importPath: '../docs/guide.md',
      heading: 'Setup',
      headingLevelOverride: '###',
      headingTextOverride: 'Quick Start',
      lineNumber: 4
    });
  });

  it('extracts @import placeholders for code symbols', () => {
    const content = `
      @import[src/meld.ts # myFunction]
      @import[src/meld.ts # {interface}]
      @import[src/meld.ts # [myFunction, otherFunction]]
    `;
    const placeholders = extractPlaceholders(content);
    expect(placeholders).toHaveLength(3);
    
    expect(placeholders[0]).toMatchObject({
      type: 'import',
      importPath: 'src/meld.ts',
      importSymbol: 'myFunction',
      lineNumber: 2
    });

    expect(placeholders[1]).toMatchObject({
      type: 'import',
      importPath: 'src/meld.ts',
      importSymbol: '{interface}',
      lineNumber: 3
    });

    expect(placeholders[2]).toMatchObject({
      type: 'import',
      importPath: 'src/meld.ts',
      importSymbolList: ['myFunction', 'otherFunction'],
      lineNumber: 4
    });
  });

  it('handles multiple placeholders on the same line', () => {
    const content = '@cmd[echo "hi"] some text @import[file.md # Title] more text @cmd[ls]';
    const placeholders = extractPlaceholders(content);
    expect(placeholders).toHaveLength(3);
    expect(placeholders[0]).toMatchObject({
      type: 'cmd',
      command: 'echo "hi"'
    });
    expect(placeholders[1]).toMatchObject({
      type: 'import',
      importPath: 'file.md',
      heading: 'Title'
    });
    expect(placeholders[2]).toMatchObject({
      type: 'cmd',
      command: 'ls'
    });
  });

  it('handles empty or malformed input gracefully', () => {
    expect(extractPlaceholders('')).toHaveLength(0);
    expect(extractPlaceholders('@cmd[]')).toHaveLength(1);
    expect(extractPlaceholders('@import[]')).toHaveLength(1);
  });
}); 