"use client"

import { useRouter } from "next/navigation"
import { useEffect } from "react"

import { trpc } from "@/lib/trpc/client"

import LoadingSpinner from "@/components/LoadingSpinner"
import {
  trackAncillaryFailed,
  trackAncillarySuccess,
} from "@/utils/tracking/myStay"

import {
  buildAncillaryPackages,
  clearAncillarySessionData,
  getAncillarySessionData,
} from "../utils"

import type { Lang } from "@/constants/languages"

export default function GuaranteeAncillaryHandler({
  confirmationNumber,
  returnUrl,
  lang,
}: {
  confirmationNumber: string
  returnUrl: string
  lang: Lang
}) {
  const router = useRouter()

  const addAncillary = trpc.booking.packages.useMutation()

  useEffect(() => {
    if (addAncillary.isPending || addAncillary.submittedAt) {
      return
    }

    const sessionData = getAncillarySessionData()
    if (!sessionData?.formData || !sessionData?.selectedAncillary) {
      router.replace(`${returnUrl}&errorCode=AncillaryFailed`)
      return
    }

    const { formData, selectedAncillary } = sessionData
    const packages = buildAncillaryPackages(formData, selectedAncillary)

    addAncillary.mutate(
      {
        confirmationNumber,
        ancillaryComment: formData.optionalText,
        ancillaryDeliveryTime: selectedAncillary.requiresDeliveryTime
          ? formData.deliveryTime
          : undefined,
        packages,
        language: lang,
      },
      {
        onSuccess: (data) => {
          if (data) {
            trackAncillarySuccess(
              confirmationNumber,
              packages,
              formData.deliveryTime,
              "room + ancillary",
              selectedAncillary
            )
            clearAncillarySessionData()
            router.replace(returnUrl)
          } else {
            trackAncillaryFailed(
              packages,
              formData.deliveryTime,
              selectedAncillary
            )
            router.replace(`${returnUrl}&errorCode=AncillaryFailed`)
          }
        },
        onError: () => {
          trackAncillaryFailed(
            packages,
            formData.deliveryTime,
            selectedAncillary
          )
          router.replace(`${returnUrl}&errorCode=AncillaryFailed`)
        },
      }
    )
  }, [confirmationNumber, returnUrl, addAncillary, lang, router])

  return <LoadingSpinner />
}
