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

afterEach(() => {
  delete process.env.API_INTERNAL_URL
  delete process.env.NEXT_PUBLIC_API_URL
  vi.restoreAllMocks()
  Reflect.deleteProperty(globalThis, 'fetch')
  vi.resetModules()
})

describe('adminFetch', () => {
  it('requests through the server API base and returns the data envelope', async () => {
    process.env.API_INTERNAL_URL = 'http://internal-api/api/v1'
    const fetchMock = vi.fn(async () => ({
      ok: true,
      json: async () => ({ data: { companies: [] } }),
    }))
    Object.defineProperty(globalThis, 'fetch', { configurable: true, value: fetchMock })

    const { adminFetch } = await import('./api')
    await expect(adminFetch('/admin/companies', 'admin-token')).resolves.toEqual({ companies: [] })

    expect(fetchMock).toHaveBeenCalledWith('http://internal-api/api/v1/admin/companies', {
      cache: 'no-store',
      credentials: 'include',
    })
  })

  it('omits authorization when no token is supplied', async () => {
    delete process.env.API_INTERNAL_URL
    const fetchMock = vi.fn(async () => ({ ok: true, json: async () => ({ data: { ok: true } }) }))
    Object.defineProperty(globalThis, 'fetch', { configurable: true, value: fetchMock })

    const { adminFetch } = await import('./api')
    await adminFetch('/public')

    expect((fetchMock as any).mock.calls[0]?.[1]).toEqual({ cache: 'no-store', credentials: 'include' })
  })

  it('throws the API message from failed responses', async () => {
    const fetchMock = vi.fn(async () => ({ ok: false, json: async () => ({ message: 'Admin only' }) }))
    Object.defineProperty(globalThis, 'fetch', { configurable: true, value: fetchMock })

    const { adminFetch } = await import('./api')
    await expect(adminFetch('/admin/menu')).rejects.toThrow('Admin only')
  })
})
