import { afterEach, describe, expect, it } from 'vitest'
import { http, HttpResponse } from 'msw'
import { server } from './msw/server'
import { api } from '../src/api'
import { seedBearer, clearBearer } from './helpers/auth'
import { loadEnumSnapshot } from './fixtures/enum_spec_snapshot'

// Smoke tests for AZ-456 (Test Infrastructure):
//   - AC-3 : MSW intercepts every outbound /api/<service>/* fetch (default
//            handler match + per-test override + reset between tests).
//   - AC-4 : Vitest discovers this file under jsdom, runs it, and the
//            scripts/run-tests.sh runner emits ./test-output/fast-report.xml
//            (the JUnit reporter is wired in vitest.config.ts).
//   - AC-7 : The JUnit/CSV report shape is asserted by scripts/run-tests.sh
//            after this suite finishes — see the [fast] section there.

describe('AZ-456 fast-profile infrastructure', () => {
  afterEach(() => {
    clearBearer()
  })

  it('AC-3: MSW intercepts a default /api/admin/* fetch', async () => {
    seedBearer()
    const me = await api.get<{ id: string; email: string }>('/api/admin/users/me')
    expect(me.id).toBe('user-alice')
    expect(me.email).toBe('op_alice@test.local')
  })

  it('AC-3: per-test server.use(...) overrides the default handler', async () => {
    seedBearer()
    server.use(
      http.get('/api/admin/users/me', () =>
        HttpResponse.json({ id: 'user-override', email: 'override@test.local' }),
      ),
    )
    const me = await api.get<{ id: string; email: string }>('/api/admin/users/me')
    expect(me.id).toBe('user-override')
  })

  it('AC-3: handlers reset between tests (default returns op_alice again)', async () => {
    seedBearer()
    const me = await api.get<{ id: string; email: string }>('/api/admin/users/me')
    expect(me.id).toBe('user-alice')
  })

  it('AC-4: jsdom + Vitest globals are configured', () => {
    expect(typeof window).toBe('object')
    expect(typeof document).toBe('object')
    // @testing-library/jest-dom matchers are extended via tests/setup.ts.
    const el = document.createElement('div')
    el.textContent = 'hello'
    expect(el).toHaveTextContent('hello')
  })

  it('AC-4 / AC-29: enum spec snapshot is reachable from tests', () => {
    const spec = loadEnumSnapshot()
    expect(spec.enums.AnnotationStatus.values).toMatchObject({
      None: 0, Created: 10, Edited: 20, Validated: 30, Deleted: 40,
    })
  })
})
