import { act, render, screen } from '@testing-library/react'
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
import { IdleTimer } from './IdleTimer'

describe('IdleTimer', () => {
  const now = Date.UTC(2026, 6, 18, 12)

  beforeEach(() => {
    vi.useFakeTimers()
    vi.setSystemTime(now)
  })
  afterEach(() => vi.useRealTimers())

  it('renders the A10 gap without starting a fake clock', () => {
    render(<IdleTimer idle={null} />)
    expect(screen.getByText('idle signal needs A10')).toBeInTheDocument()
    act(() => vi.advanceTimersByTime(5_000))
    expect(screen.getByText('idle signal needs A10')).toBeInTheDocument()
  })

  it.each([
    ['Working', now - 9_999, true],
    ['No progress', now - 10_000, true],
    ['Watchdog recovering', now - 20_000, true],
    ['Ended', now - 20_000, false],
  ])('renders %s at its threshold boundary', (expected, lastProgressAt, alive) => {
    render(<IdleTimer idle={{ lastProgressAt, idleTimeoutMs: 10_000, alive }} />)
    expect(screen.getByText(expected)).toBeInTheDocument()
  })

  it('ticks once per second when watchdog data is present', () => {
    render(<IdleTimer idle={{ lastProgressAt: now - 9_000, idleTimeoutMs: 10_000, alive: true }} />)
    expect(screen.getByText('Working')).toBeInTheDocument()
    act(() => vi.advanceTimersByTime(1_000))
    expect(screen.getByText('No progress')).toBeInTheDocument()
  })
})
