import { fireEvent, render, screen } from '@testing-library/react'
import { describe, expect, it, vi } from 'vitest'
import { HostLogsModal } from './HostLogsModal'

describe('HostLogsModal', () => {
  it('renders log lines in a monospace scrollable body', () => {
    render(
      <HostLogsModal
        open
        host="debian1"
        lines={['2026-07-21T10:00:00Z builder ready', '2026-07-21T10:01:00Z dispatch ok']}
        loading={false}
        error={null}
        onClose={() => {}}
        onRefresh={() => {}}
      />,
    )

    const body = screen.getByTestId('host-logs-body')
    expect(body).toHaveClass('font-mono')
    expect(body.textContent).toContain('builder ready')
    expect(body.textContent).toContain('dispatch ok')
  })

  it('shows loading, empty, and error states honestly', () => {
    const { rerender } = render(
      <HostLogsModal
        open
        host="debian1"
        lines={[]}
        loading
        error={null}
        onClose={() => {}}
        onRefresh={() => {}}
      />,
    )
    expect(screen.getByTestId('host-logs-loading')).toHaveTextContent('Loading logs…')

    rerender(
      <HostLogsModal
        open
        host="debian1"
        lines={[]}
        loading={false}
        error={null}
        onClose={() => {}}
        onRefresh={() => {}}
      />,
    )
    expect(screen.getByTestId('host-logs-empty')).toHaveTextContent('No log lines recorded')

    rerender(
      <HostLogsModal
        open
        host="debian1"
        lines={[]}
        loading={false}
        error="collector unreachable"
        onClose={() => {}}
        onRefresh={() => {}}
      />,
    )
    expect(screen.getByRole('alert')).toHaveTextContent('collector unreachable')
  })

  it('invokes onClose and onRefresh', () => {
    const onClose = vi.fn()
    const onRefresh = vi.fn()
    render(
      <HostLogsModal
        open
        host="debian1"
        lines={['line']}
        loading={false}
        error={null}
        onClose={onClose}
        onRefresh={onRefresh}
      />,
    )

    fireEvent.click(screen.getByRole('button', { name: 'Refresh' }))
    expect(onRefresh).toHaveBeenCalledTimes(1)

    fireEvent.click(screen.getByLabelText('Close'))
    expect(onClose).toHaveBeenCalledTimes(1)
  })
})
