import { afterEach, describe, expect, it, vi } from 'vitest'

import { RevolutionaryTypedFetch } from '../src/core/typed-fetch.js'

const jsonResponse = (body: any) =>
  new Response(JSON.stringify(body), {
    headers: { 'Content-Type': 'application/json' }
  })

describe('RevolutionaryTypedFetch request polish', () => {
  afterEach(() => {
    vi.restoreAllMocks()
  })

  it('applies a JSON content-type automatically for plain object bodies', async () => {
    const fetchSpy = vi.fn(async (_url, init) => {
      const headers = new Headers(init?.headers as HeadersInit)
      expect(headers.get('content-type')).toBe('application/json')
      return jsonResponse({ ok: true })
    })
    vi.stubGlobal('fetch', fetchSpy)

    const client = new RevolutionaryTypedFetch({ request: { baseURL: 'https://api.test' } })
    await client.post('/items', { name: 'test' })

    expect(fetchSpy).toHaveBeenCalledTimes(1)
  })

  it('does not dedupe concurrent requests when bodies differ', async () => {
    const fetchSpy = vi.fn(async (_url, init) => {
      return jsonResponse({ echoed: init?.body })
    })
    vi.stubGlobal('fetch', fetchSpy)

    const client = new RevolutionaryTypedFetch({ request: { baseURL: 'https://api.test' } })
    await Promise.all([
      client.post('/items', { name: 'one' }),
      client.post('/items', { name: 'two' })
    ])

    expect(fetchSpy).toHaveBeenCalledTimes(2)
  })
})
