import { fireEvent, render, screen } from '@testing-library/react'
import { describe, expect, it, vi } from 'vitest'
import { FLEET_DEBIAN1, OFFLOAD_CONTROL_FIXTURE } from './fixtures/offload'
import { OffloadControl } from './OffloadControl'

describe('OffloadControl', () => {
  it('renders state machine, kv rows, probes, and selected host label', () => {
    render(
      <OffloadControl
        control={OFFLOAD_CONTROL_FIXTURE}
        selectedHost={FLEET_DEBIAN1}
        onAction={() => {}}
        pendingVerb={null}
        actionError={null}
      />,
    )
    expect(screen.getByTestId('offload-control')).toBeInTheDocument()
    expect(screen.getByText('available')).toBeInTheDocument()
    expect(screen.getByText('4192')).toBeInTheDocument()
    expect(screen.getByText(/wedged/)).toBeInTheDocument()
    expect(screen.getByTestId('offload-selected-host')).toHaveTextContent('selected host: debian1')
    expect(screen.getByRole('button', { name: 'Drain box' })).toHaveAttribute('data-action-verb', 'box-drain')
  })

  it('disables host-scoped actions until a host is selected', () => {
    const onAction = vi.fn()
    render(
      <OffloadControl
        control={OFFLOAD_CONTROL_FIXTURE}
        selectedHost={null}
        onAction={onAction}
        pendingVerb={null}
        actionError={null}
      />,
    )

    expect(screen.getByTestId('offload-selected-host')).toHaveTextContent('no host selected')
    const drain = screen.getByRole('button', { name: 'Drain box' })
    expect(drain).toBeDisabled()
    fireEvent.click(drain)
    expect(onAction).not.toHaveBeenCalled()

    const reconcile = screen.getByRole('button', { name: 'Restore box' })
    expect(reconcile).toBeDisabled()
    expect(screen.getByRole('button', { name: 'Quarantine host' })).toBeDisabled()
    expect(screen.getByRole('button', { name: 'Restore box' })).toBeDisabled()
  })

  it('disables host-scoped actions for a host the registry marks unreachable', () => {
    render(
      <OffloadControl
        control={OFFLOAD_CONTROL_FIXTURE}
        selectedHost={{ ...FLEET_DEBIAN1, registryState: 'unreachable' }}
        onAction={() => {}}
        pendingVerb={null}
        actionError={null}
      />,
    )

    expect(screen.getByRole('button', { name: 'Drain box' })).toBeDisabled()
    expect(screen.getByRole('button', { name: 'Restore box' })).toBeDisabled()
    expect(screen.getByRole('button', { name: 'Quarantine host' })).toBeDisabled()
  })

  it('invokes onAction and blocks duplicate submission while pending', () => {
    const onAction = vi.fn()
    const { rerender } = render(
      <OffloadControl
        control={OFFLOAD_CONTROL_FIXTURE}
        selectedHost={FLEET_DEBIAN1}
        onAction={onAction}
        pendingVerb={null}
        actionError={null}
      />,
    )

    fireEvent.click(screen.getByRole('button', { name: 'Drain box' }))
    expect(onAction).toHaveBeenCalledWith({ label: 'Drain box', verb: 'box-drain', danger: true })

    rerender(
      <OffloadControl
        control={OFFLOAD_CONTROL_FIXTURE}
        selectedHost={FLEET_DEBIAN1}
        onAction={onAction}
        pendingVerb="box-drain"
        actionError={null}
      />,
    )
    const pending = screen.getByRole('button', { name: 'Running…' })
    expect(pending).toHaveAttribute('aria-busy', 'true')
    expect(screen.getByRole('button', { name: 'Restore box' })).toBeDisabled()
    fireEvent.click(pending)
    expect(onAction).toHaveBeenCalledTimes(1)
  })

  it('disables quarantine when required command is absent and surfaces action errors', () => {
    render(
      <OffloadControl
        control={OFFLOAD_CONTROL_FIXTURE}
        selectedHost={{ ...FLEET_DEBIAN1, capability: { probes: [], missingCommand: undefined } }}
        onAction={() => {}}
        pendingVerb={null}
        actionError={{ verb: 'host-quarantine', message: 'controller refused' }}
      />,
    )

    expect(screen.getByRole('button', { name: 'Quarantine host' })).toBeDisabled()
    const alert = screen.getByRole('alert')
    expect(alert).toHaveTextContent('controller refused')
    expect(screen.getByTestId('offload-control-actions')).toBeInTheDocument()
  })
})
