import { fireEvent, render, screen } from '@testing-library/react'
import { describe, expect, it, vi } from 'vitest'
import { PlanTable } from './PlanTable'
import type { PlanTableItem } from './PlanTableRow'
import { planTableItemsFixture } from './fixtures/plans'

function rowIds(): string[] { return screen.getAllByTestId('plan-table-row').map((row) => row.getAttribute('data-run-id')!) }
function renderPlanTable(items: PlanTableItem[] = planTableItemsFixture) { return render(<PlanTable items={items} selectedRunId={null} onOpen={vi.fn()} onAbandon={vi.fn()} onResolve={vi.fn()} />) }

describe('PlanTable', () => {
  it('renders every plan column and searchable content', () => {
    renderPlanTable()
    expect(screen.getByRole('table', { name: 'Plans' })).toBeInTheDocument()
    for (const header of ['Plan', 'Status', 'Attempts', 'Tasks', 'Created', 'Last active', 'Running for', 'Agents', 'Actions']) expect(screen.getByRole('columnheader', { name: header })).toBeInTheDocument()
    expect(screen.getByText('Gate hardening')).toBeInTheDocument()
    expect(screen.getAllByText('0 agents')).toHaveLength(2)
    expect(rowIds()).toEqual(['run-failed', 'run-complete'])
  })

  it('reorders rows from a sortable header using the tri-state cycle', () => {
    renderPlanTable()
    const header = screen.getByRole('button', { name: /^Plan/ })
    fireEvent.click(header)
    fireEvent.click(header)
    expect(rowIds()).toEqual(['run-failed', 'run-complete'])
    fireEvent.click(header)
    fireEvent.click(header)
    expect(rowIds()).toEqual(['run-complete', 'run-failed'])
  })

  it('pre-sorts active plans first and is stable by source order', () => {
    renderPlanTable([planTableItemsFixture[0]!, { ...planTableItemsFixture[0]!, runId: 'run-running', slug: 'running', title: 'Running', status: 'running', tasksCompleted: 2, tasksTotal: 4, updatedAtMs: Date.UTC(2026, 6, 19, 11, 50) }])
    expect(rowIds()).toEqual(['run-running', 'run-failed'])
  })

  it('keeps failed actions visible while needs-you uses its shared status category', () => {
    renderPlanTable([...planTableItemsFixture, { ...planTableItemsFixture[1]!, runId: 'run-needs-you', needsYou: true }])
    expect(rowIds()[0]).toBe('run-needs-you')
    expect(screen.getByText('needs you')).toBeInTheDocument()
    expect(screen.getByRole('button', { name: 'Inspect gate log' })).toBeInTheDocument()
  })
})
