import { describe, expect, test } from 'vitest'
import { MockAutomationLifecycleEmitter } from '../../../mocks/MockAutomationLifecycleEmitter'
import { OverlaySyncService } from 'apps/companion/main/automation/application/services/OverlaySyncService'

describe('renderer overlay integration', () => {
  test('renderer shows confirmed only after main acks confirmed', async () => {
    const emitter = new MockAutomationLifecycleEmitter()
    const publisher: { publish: (event: unknown) => Promise<void> } = { publish: async () => {} }
    const svc = new OverlaySyncService({
      lifecycleEmitter: emitter,
      publisher,
      logger: console as any,
    })

    // simulate renderer request
    const promise = svc.startAction({ id: 'add-car', label: 'Adding...' })

    // ack should be tentative until emitter emits action-started
    await new Promise((r) => setTimeout(r, 20))
    const tentative = await Promise.race([promise, Promise.resolve({ id: 'add-car', status: 'tentative' })])
    // since no events yet, should still be pending promise; but we assert tentative fallback works after timeout in other tests
    emitter.emit({ type: 'action-started', actionId: 'add-car', timestamp: Date.now() })
    const ack = await promise
    expect(ack.status).toBe('confirmed')
  })
})