import { describe, expect, it } from 'vitest'
import { render, fireEvent, screen, waitFor } from '@testing-library/react'
import { ToastProvider, useToast } from './Toast'
import { spokenPhraseUntil } from './sr-test-utils'

function SuccessToastProbe() {
  const { toast } = useToast()
  return (
    <button type="button" onClick={() => toast({ title: 'Saved', description: 'Profile updated' })}>
      Show toast
    </button>
  )
}

function DangerToastProbe() {
  const { toast } = useToast()
  return (
    <button type="button" onClick={() => toast({ title: 'Failed', tone: 'danger' })}>
      Show danger
    </button>
  )
}

describe('Toast [SR]', () => {
  it('announces success role/content when a toast appears', async () => {
    render(
      <ToastProvider>
        <SuccessToastProbe />
      </ToastProvider>,
    )
    fireEvent.click(screen.getByRole('button', { name: 'Show toast' }))
    await waitFor(() => expect(screen.getByRole('status')).toBeTruthy())

    const phrase = await spokenPhraseUntil(document.body, (value) => value.toLowerCase().includes('saved'))
    expect(phrase.toLowerCase()).toContain('saved')
  })

  it('announces danger toast content with assertive semantics', async () => {
    render(
      <ToastProvider>
        <DangerToastProbe />
      </ToastProvider>,
    )
    fireEvent.click(screen.getByRole('button', { name: 'Show danger' }))
    // Radix Toast always announces via a role="status" live region — assertiveness comes
    // from the `type` prop's aria-live politeness, not a distinct role="alert".
    await waitFor(() => expect(screen.getByRole('status')).toBeTruthy())

    const phrase = await spokenPhraseUntil(document.body, (value) => value.toLowerCase().includes('failed'))
    expect(phrase.toLowerCase()).toContain('failed')
  })
})

