import { describe, expect, it } from 'vitest'
import { fetchCiDeliveryData } from './ci-delivery-query'

const observedAt = '2026-08-12T10:00:00.000Z'

describe('fetchCiDeliveryData', () => {
  it('reads only the deploy-status panel from collector state', async () => {
    const fetchState = async () => ({
      adapters: [{ id: 'deploy-status', interval: 30_000, consecutiveErrors: 0, stale: false }],
      panels: [
        { id: 'plans', ts: observedAt, data: { status: 'running' } },
        {
          id: 'deploy-status',
          ts: observedAt,
          data: {
            state: 'queued',
            complete: true,
            observedAt,
            queue: { requests: [{ id: 'req-100-example', observedAt }], depth: 1, oldestAgeMs: 10_000 },
            operation: null,
            holder: null,
            latestEvent: null,
            latestProgressAt: null,
            reason: null,
          },
        },
      ],
    })

    await expect(fetchCiDeliveryData(fetchState, Date.parse(observedAt))).resolves.toMatchObject({
      status: 'queued',
      completeness: 'complete',
      freshness: 'fresh',
      queue: { requests: [{ id: 'req-100-example' }], depth: 1 },
    })
  })

  it('marks a stale collector panel stale without changing its delivery state', async () => {
    await expect(fetchCiDeliveryData(async () => ({
      adapters: [{ id: 'deploy-status', interval: 30_000, consecutiveErrors: 0, stale: false }],
      panels: [{
        id: 'deploy-status',
        ts: '2026-08-12T09:58:00.000Z',
        data: {
          state: 'running', complete: false, observedAt: '2026-08-12T09:58:00.000Z',
          queue: { requests: [], depth: 0, oldestAgeMs: null }, operation: null, holder: 'pid:1234',
          latestEvent: null, latestProgressAt: null, reason: 'lifecycle record unavailable',
        },
      }],
    }), Date.parse(observedAt))).resolves.toMatchObject({ status: 'running', freshness: 'stale' })
  })

  it('returns explicit unknown when deploy-status is absent', async () => {
    await expect(fetchCiDeliveryData(async () => ({ panels: [], adapters: [] }))).resolves.toEqual({
      status: 'unknown',
      completeness: 'incomplete',
      freshness: 'unknown',
      observedAt: null,
      queue: null,
      current: null,
      latestEvent: null,
      latestProgressAt: null,
      reason: 'deploy-status data unavailable',
      identity: { servedSha: null, mainSha: null, commitsBehind: null, mainCommitAt: null },
      watcher: null,
    })
  })

  it('does not convert collector request failures into deployment state', async () => {
    await expect(fetchCiDeliveryData(async () => { throw new Error('collector unavailable') })).rejects.toThrow('collector unavailable')
  })
})
