import { fireEvent, render, screen, within } from '@testing-library/react'
import { describe, expect, it, vi } from 'vitest'
import { RUN_SETTINGS } from './fixtures/settings'
import { SettingsTable } from './SettingsTable'

describe('SettingsTable', () => {
  it('renders aligned settings columns without pills', () => {
    render(<SettingsTable items={RUN_SETTINGS} onSave={vi.fn()} />)

    expect(screen.getByRole('columnheader', { name: 'Setting' })).toBeInTheDocument()
    expect(screen.getByRole('columnheader', { name: 'Value' })).toBeInTheDocument()
    expect(screen.getByRole('columnheader', { name: 'Decided by' })).toBeInTheDocument()
    expect(screen.getByRole('columnheader', { name: 'Can I change it?' })).toBeInTheDocument()
    expect(screen.getByText('Parallel tasks')).toBeInTheDocument()
  })

  it('expands all five layers inline and saves a run override', () => {
    const onSave = vi.fn()
    render(<SettingsTable items={RUN_SETTINGS} onSave={onSave} />)

    fireEvent.click(screen.getByRole('button', { name: 'Expand Parallel tasks' }))
    const editor = screen.getByTestId('layer-ladder-concurrency')
    for (const label of ['Engine default', 'Home', 'Repo', 'Plan', 'This run']) {
      expect(within(editor).getByText(label)).toBeInTheDocument()
    }

    const runInput = within(editor).getByLabelText('This run value')
    fireEvent.change(runInput, { target: { value: '5' } })
    fireEvent.click(within(editor).getByRole('button', { name: 'Save This run' }))
    expect(onSave).toHaveBeenCalledWith('concurrency', 'run', '5')
    expect(within(editor).getByText('run override applies now')).toBeInTheDocument()
  })

  it('renders immutable layers without inputs', () => {
    render(<SettingsTable items={RUN_SETTINGS} onSave={vi.fn()} />)

    fireEvent.click(screen.getByRole('button', { name: 'Expand Base branch' }))
    expect(within(screen.getByTestId('layer-ladder-base_branch')).queryByRole('textbox')).not.toBeInTheDocument()
  })

  it('renders the B5 gap state', () => {
    render(<SettingsTable items={null} onSave={vi.fn()} />)
    expect(screen.getByText('config surface needs B5')).toBeInTheDocument()
  })

  it('reorders rows when a sortable header is clicked', () => {
    render(<SettingsTable items={RUN_SETTINGS} onSave={vi.fn()} />)

    fireEvent.click(screen.getByRole('button', { name: /^Setting/ }))
    const rows = screen.getAllByRole('row').slice(1)
    expect(rows[0]).toHaveTextContent('Base branch')
    expect(rows[1]).toHaveTextContent('Parallel tasks')
  })
})
