import { fireEvent, render, screen, within } from '@testing-library/react'
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
import { AgentFeed } from './AgentFeed'
import { agentTurnsFixture } from './fixtures/agent'

describe('AgentFeed', () => {
  beforeEach(() => {
    vi.useFakeTimers()
    vi.setSystemTime(Date.UTC(2026, 6, 18, 12))
  })
  afterEach(() => vi.useRealTimers())

  it('sorts turn cards chronologically', () => {
    render(
      <AgentFeed
        turns={[...agentTurnsFixture].reverse()}
        live
        rawLogAvailable={false}
      />,
    )

    const cards = screen.getAllByTestId('agent-turn-card')
    expect(within(cards[0]!).getByText('llm-implement')).toBeInTheDocument()
    expect(within(cards.at(-1)!).getByText('llm-fixer')).toBeInTheDocument()
  })

  it('marks an unfinished live turn as in progress', () => {
    render(
      <AgentFeed
        turns={[{ ...agentTurnsFixture[0]!, durMs: null }]}
        live
        rawLogAvailable={false}
      />,
    )

    expect(screen.getByText('In progress')).toBeInTheDocument()
    expect(screen.getByTestId('agent-turn-progress')).toHaveClass('animate-pulse')
  })

  it('renders an ended banner for historical activity', () => {
    render(<AgentFeed turns={agentTurnsFixture} live={false} rawLogAvailable={false} />)
    expect(screen.getByText('This agent attempt ended.')).toBeInTheDocument()
    expect(screen.queryByText('Streaming')).not.toBeInTheDocument()
  })

  it('labels absent raw event detail without inventing a harness version gap', () => {
    render(<AgentFeed turns={agentTurnsFixture} live rawLogAvailable={false} />)
    fireEvent.click(screen.getByRole('button', { name: 'Show raw log' }))
    expect(screen.getByText('Raw event detail is not provided by this run.')).toBeInTheDocument()
    expect(screen.getByRole('button', { name: 'Show friendly feed' })).toHaveAttribute(
      'aria-pressed',
      'true',
    )
  })

  it('passes the exact context-menu trigger to diagnostics', () => {
    const onOpenDiagnostics = vi.fn()
    render(<AgentFeed items={[{ id: 'edit', at: 1, kind: 'progress', title: 'Worked', diagnosticEventIds: [] }]} live onOpenDiagnostics={onOpenDiagnostics} />)
    const row = screen.getByTestId('agent-turn-card')
    fireEvent.contextMenu(row)
    expect(onOpenDiagnostics).toHaveBeenCalledWith('edit', row)
    expect(row).toHaveFocus()
  })

  it('renders hostile authoritative payload as text', () => {
    render(<AgentFeed turns={[]} live rawLogAvailable events={[{ id: 'opaque', text: '<img src=x onerror=alert(1)>' }]} />)
    fireEvent.click(screen.getByRole('button', { name: 'Show raw log' }))
    expect(screen.getByText((_, element) => (
      element?.tagName === 'PRE'
      && element.textContent === 'opaque\n<img src=x onerror=alert(1)>'
    ))).toBeInTheDocument()
    expect(document.querySelector('img')).toBeNull()
  })
})
