import { FetchError, postJSON } from '@/infrastructure/fetch-json'
import { loadStripe } from '@stripe/stripe-js/pure'

export default async function handleStripePaymentAction(
  error: FetchError
): Promise<{ handled: boolean }> {
  const clientSecret = error?.data?.clientSecret
  const publicKey = error?.data?.publicKey

  if (clientSecret && publicKey) {
    const stripe = await loadStripe(publicKey)
    if (stripe) {
      const manualConfirmationFlow =
        await stripe.confirmCardPayment(clientSecret)
      if (!manualConfirmationFlow.error) {
        try {
          await postJSON(`/user/subscription/sync`)
        } catch (error) {
          // if the sync fails, there may be stale data until the webhook is
          // processed but we can't do any special handling for that in here
        }
        return { handled: true }
      }
    }
  }
  return { handled: false }
}
