// @vitest-environment jsdom
import { render, renderHook } from '@testing-library/react'
import { describe, expect, it, vi } from 'vitest'
import type { ReactNode } from 'react'
import { MarketplaceProvider, useMarketplaceContext } from './MarketplaceProvider.js'
import { isMarketplaceProviderError } from './errors.js'
import type { MarketplaceClient } from './client.js'

const mockClient: MarketplaceClient = {
  getVendorProfile: vi.fn(),
  getVendorOrders: vi.fn(),
  applyAsVendor: vi.fn(),
  createVendorProduct: vi.fn(),
  updateVendorProduct: vi.fn(),
}

describe('MarketplaceProvider', () => {
  it('provides the injected client to a child consumer', () => {
    function Child() {
      const { client } = useMarketplaceContext('test')
      expect(client).toBe(mockClient)
      return <span>ok</span>
    }
    const { getByText } = render(
      <MarketplaceProvider client={mockClient}>
        <Child />
      </MarketplaceProvider>,
    )
    expect(getByText('ok')).toBeTruthy()
  })

  it('throws MarketplaceProviderError when a hook is used outside the provider', () => {
    const caught = (() => {
      try {
        renderHook(() => useMarketplaceContext('useVendorProfile'))
      } catch (e) {
        return e
      }
    })()
    expect(isMarketplaceProviderError(caught)).toBe(true)
  })

  it('propagates the exact client instance through context', () => {
    const wrapper = ({ children }: { children: ReactNode }) => (
      <MarketplaceProvider client={mockClient}>{children}</MarketplaceProvider>
    )
    const { result } = renderHook(() => useMarketplaceContext('test'), { wrapper })
    expect(result.current).toEqual({ client: mockClient })
    expect(result.current.client).toBe(mockClient)
  })
})
