import { describe, it, expect, beforeEach, vi } from 'vitest'
import { useToast } from '~/composables/useToast'

describe('useToast', () => {
  beforeEach(() => {
    vi.useFakeTimers()
    const { clearAll } = useToast()
    clearAll()
  })

  it('returns all expected functions', () => {
    const toast = useToast()
    expect(typeof toast.showToast).toBe('function')
    expect(typeof toast.showSuccess).toBe('function')
    expect(typeof toast.showError).toBe('function')
    expect(typeof toast.showWarning).toBe('function')
    expect(typeof toast.showInfo).toBe('function')
    expect(typeof toast.removeToast).toBe('function')
    expect(typeof toast.clearAll).toBe('function')
  })

  it('adds a toast with correct properties', () => {
    const { showToast, toasts } = useToast()
    const id = showToast('Hello', 'info')
    expect(toasts.value).toHaveLength(1)
    expect(toasts.value[0].message).toBe('Hello')
    expect(toasts.value[0].type).toBe('info')
    expect(toasts.value[0].visible).toBe(true)
    expect(toasts.value[0].id).toBe(id)
  })

  it('showSuccess creates a success toast', () => {
    const { showSuccess, toasts } = useToast()
    showSuccess('Saved!')
    expect(toasts.value[0].type).toBe('success')
    expect(toasts.value[0].message).toBe('Saved!')
  })

  it('showError creates an error toast', () => {
    const { showError, toasts } = useToast()
    showError('Failed!')
    expect(toasts.value[0].type).toBe('error')
  })

  it('showWarning creates a warning toast', () => {
    const { showWarning, toasts } = useToast()
    showWarning('Caution!')
    expect(toasts.value[0].type).toBe('warning')
  })

  it('limits to MAX_TOASTS (3)', () => {
    const { showToast, toasts } = useToast()
    showToast('A', 'info')
    showToast('B', 'info')
    showToast('C', 'info')
    showToast('D', 'info')
    expect(toasts.value).toHaveLength(3)
    expect(toasts.value[0].message).toBe('B')
    expect(toasts.value[2].message).toBe('D')
  })

  it('clearAll removes all toasts', () => {
    const { showToast, toasts, clearAll } = useToast()
    showToast('A', 'info')
    showToast('B', 'info')
    expect(toasts.value.length).toBeGreaterThan(0)
    clearAll()
    expect(toasts.value).toHaveLength(0)
  })

  it('shares state across calls (singleton)', () => {
    const a = useToast()
    const b = useToast()
    expect(a.toasts).toBe(b.toasts)
  })

  it('removeToast sets visible to false', () => {
    const { showToast, toasts, removeToast } = useToast()
    const id = showToast('Test', 'info')
    removeToast(id)
    expect(toasts.value[0].visible).toBe(false)
  })
})
