import { describe, expect, it } from 'vitest'
import { defineForm } from './define.js'
import type { FormDef } from './types.js'

const base: FormDef = {
  id: 'contact',
  fields: [
    { name: 'email', type: 'email', label: 'Email', required: true },
    { name: 'msg', type: 'textarea', label: 'Message' },
  ],
}

describe('defineForm', () => {
  it('accepts a valid definition and echoes it', () => {
    const r = defineForm(base)
    expect(r.ok).toBe(true)
    if (r.ok) expect(r.value.id).toBe('contact')
  })

  it('rejects an empty id', () => {
    const r = defineForm({ ...base, id: '' })
    expect(r.ok).toBe(false)
    if (!r.ok) expect(r.error.some((e) => e.code === 'empty-id')).toBe(true)
  })

  it('rejects no fields', () => {
    const r = defineForm({ ...base, fields: [] })
    expect(r.ok).toBe(false)
    if (!r.ok) expect(r.error.some((e) => e.code === 'no-fields')).toBe(true)
  })

  it('rejects duplicate field names', () => {
    const r = defineForm({
      ...base,
      fields: [
        { name: 'email', type: 'email', label: 'A' },
        { name: 'email', type: 'text', label: 'B' },
      ],
    })
    expect(r.ok).toBe(false)
    if (!r.ok) expect(r.error.some((e) => e.code === 'duplicate-field' && e.field === 'email')).toBe(true)
  })

  it('rejects select/radio/multiselect without options', () => {
    const r = defineForm({
      ...base,
      fields: [{ name: 'plan', type: 'select', label: 'Plan' }],
    })
    expect(r.ok).toBe(false)
    if (!r.ok) expect(r.error.some((e) => e.code === 'no-options' && e.field === 'plan')).toBe(true)
  })

  it('rejects an invalid pattern source', () => {
    const r = defineForm({
      ...base,
      fields: [{ name: 'code', type: 'text', label: 'Code', pattern: '([' }],
    })
    expect(r.ok).toBe(false)
    if (!r.ok) expect(r.error.some((e) => e.code === 'bad-pattern' && e.field === 'code')).toBe(true)
  })
})
