import { renderHook } from '@testing-library/react'
import type { ReactNode } from 'react'
import { describe, expect, it } from 'vitest'
import { ReviewsProvider } from './ReviewsProvider.js'
import { useReviewsClient } from './client.js'
import { isReviewsProviderError } from './errors.js'
import type { ReviewsClient } from './client.js'

const mockClient: ReviewsClient = {
  listReviews: async () => ({ items: [], nextCursor: null }),
  getRatingAggregate: async () => ({
    productId: 'p1',
    avg: 0,
    count: 0,
    distribution: { 1: 0, 2: 0, 3: 0, 4: 0, 5: 0 },
  }),
  submitReview: async () => ({
    id: 'r1',
    productId: 'p1',
    userId: 'u1',
    vendorId: null,
    rating: 5,
    body: null,
    status: 'pending',
    vendorReply: null,
    createdAt: '2026-06-25T10:00:00.000Z',
    updatedAt: '2026-06-25T10:00:00.000Z',
  }),
}

describe('ReviewsProvider / useReviewsClient', () => {
  it('throws ReviewsProviderError when used outside a provider', () => {
    expect(() => renderHook(() => useReviewsClient('useReviewList'))).toThrow()
    try {
      renderHook(() => useReviewsClient('useReviewList'))
    } catch (e) {
      expect(isReviewsProviderError(e)).toBe(true)
    }
  })

  it('provides the injected client inside the provider', () => {
    const wrapper = ({ children }: { children: ReactNode }) => (
      <ReviewsProvider client={mockClient}>{children}</ReviewsProvider>
    )
    const { result } = renderHook(() => useReviewsClient('useReviewList'), { wrapper })
    expect(result.current).toBe(mockClient)
  })
})
