import type { FlagDefinition } from './types.js'
import { describe, expect, it } from 'vitest'
import { OutputFormatNotSupportedError, UnsupportedArgValueError } from './errors.js'

describe('OutputFormatNotSupportedError', () => {
  it('states the offending format in the message', () => {
    const err = new OutputFormatNotSupportedError('csv')
    expect(err.message).toBe('format csv is not supported by this command')
  })
})

describe('UnsupportedArgValueError', () => {
  it('includes both long and short option labels when a char exists', () => {
    const def: FlagDefinition = { type: 'string', description: 'output', char: 'o', options: ['json', 'yaml'] }
    const err = new UnsupportedArgValueError('output', def, 'csv')
    expect(err.message).toBe('illegal value csv for flag --output / -o')
  })

  it('omits the short option label when the flag has no char', () => {
    const def: FlagDefinition = { type: 'string', description: 'app mode', options: ['chat', 'workflow'] }
    const err = new UnsupportedArgValueError('mode', def, 'chatbot')
    expect(err.message).toBe('illegal value chatbot for flag --mode')
  })

  it('lists supported values in the hint', () => {
    const def: FlagDefinition = { type: 'string', description: 'app mode', options: ['chat', 'workflow'] }
    expect(new UnsupportedArgValueError('mode', def, 'chatbot').hint).toBe('supported value: chat, workflow')
  })

  it('leaves the hint empty when the flag declares no options', () => {
    const def: FlagDefinition = { type: 'string', description: 'app mode' }
    expect(new UnsupportedArgValueError('mode', def, 'chatbot').hint).toBe('')
  })
})
