import { render, renderHook, screen, waitFor } from '@testing-library/react'
import { describe, expect, it, vi, beforeEach } from 'vitest'
import { useCheckout } from './useCheckout.js'
import { CheckoutProvider } from './CheckoutProvider.js'
import { isCheckoutProviderError } from './errors.js'
import type { CheckoutClient } from './client.js'

beforeEach(() => sessionStorage.clear())

const wrapper =
  (client: CheckoutClient) =>
  ({ children }: { children: React.ReactNode }) =>
    (
      <CheckoutProvider client={client} cartId="c1">
        {children}
      </CheckoutProvider>
    )

describe('useCheckout', () => {
  it('throws CheckoutProviderError outside a provider — but never throws a payment-provider error', () => {
    try {
      renderHook(() => useCheckout())
      throw new Error('should have thrown')
    } catch (e) {
      expect(isCheckoutProviderError(e)).toBe(true)
    }
  })

  it('exposes phase/submit/reset and reaches paid via the provider poll', async () => {
    const client: CheckoutClient = {
      start: vi.fn().mockResolvedValue({ orderId: 'o1' }),
      getStatus: vi.fn().mockResolvedValue({ status: 'paid' }),
    }
    const { result } = renderHook(() => useCheckout(), { wrapper: wrapper(client) })
    expect(result.current.phase).toBe('idle')
    await result.current.submit({ cartId: 'c1', priceMode: 'inclusive', currency: 'usd', buyerCountry: 'US' })
    await waitFor(() => expect(result.current.phase).toBe('paid'))
  })
})