import { describe, it, beforeEach, vi, expect } from 'vitest'
import { startEventStream } from './eventStream'
import { serverDown } from './actions'
import config from './config'

class MockEventSource {
  constructor(url) {
    this.url = url
    this.readyState = 1
    this.listeners = {}
    this.onerror = null
  }
  addEventListener(type, handler) {
    this.listeners[type] = handler
  }
  close() {
    this.readyState = 2
  }
}

describe('startEventStream', () => {
  vi.useFakeTimers()
  let dispatch
  let instance

  beforeEach(() => {
    dispatch = vi.fn()
    global.EventSource = vi.fn().mockImplementation(function (url) {
      instance = new MockEventSource(url)
      return instance
    })
    localStorage.setItem('is-authenticated', 'true')
    localStorage.setItem('token', 'abc')
    config.devNewEventStream = true
    // Mock console.log to suppress output during tests
    vi.spyOn(console, 'log').mockImplementation(() => {})
  })

  afterEach(() => {
    config.devNewEventStream = false
  })

  it('reconnects after an error', async () => {
    await startEventStream(dispatch)
    expect(global.EventSource).toHaveBeenCalledTimes(1)
    instance.onerror(new Event('error'))
    expect(dispatch).toHaveBeenCalledWith(serverDown())
    vi.advanceTimersByTime(5000)
    expect(global.EventSource).toHaveBeenCalledTimes(2)
  })
})
