import { fireEvent, render, screen } from '@testing-library/react'
import { describe, expect, it, vi } from 'vitest'
import { AgentComposer } from './AgentComposer'

function deferred() {
  let resolve!: () => void
  let reject!: (error: Error) => void
  const promise = new Promise<void>((onResolve, onReject) => {
    resolve = onResolve
    reject = onReject
  })
  return { promise, resolve, reject }
}

describe('AgentComposer', () => {
  it('disables sending while in flight and clears text on success', async () => {
    const request = deferred()
    const onSend = vi.fn(() => request.promise)
    render(<AgentComposer onSend={onSend} />)

    const textarea = screen.getByRole('textbox', { name: 'Message to agent' })
    fireEvent.change(textarea, { target: { value: 'Focus on the failing gate.' } })
    fireEvent.click(screen.getByRole('button', { name: 'Send' }))

    expect(onSend).toHaveBeenCalledWith('Focus on the failing gate.')
    expect(screen.getByRole('button', { name: 'Sending…' })).toBeDisabled()
    expect(textarea).toBeDisabled()

    request.resolve()
    await screen.findByRole('button', { name: 'Send' })
    expect(textarea).toHaveValue('')
  })

  it('surfaces send errors inline and preserves the message', async () => {
    const onSend = vi.fn().mockRejectedValue(new Error('Collector unavailable'))
    render(<AgentComposer onSend={onSend} />)

    const textarea = screen.getByRole('textbox', { name: 'Message to agent' })
    fireEvent.change(textarea, { target: { value: 'Retry the focused test.' } })
    fireEvent.click(screen.getByRole('button', { name: 'Send' }))

    expect(await screen.findByRole('alert')).toHaveTextContent('Collector unavailable')
    expect(textarea).toHaveValue('Retry the focused test.')
    expect(screen.getByRole('button', { name: 'Send' })).toBeEnabled()
  })
})
