import "server-only"

import { cache } from "react"

import { BookingFlowConfigContextProvider } from "./bookingFlowConfigContext"

import type { LangRoute } from "@scandic-hotels/common/constants/routes/langRoute"

import type { BookingFlowVariant } from "./bookingFlowVariants"

export type BookingFlowConfig = {
  bookingCodeEnabled: boolean
  redemptionEnabled: boolean
  savedCreditCardsEnabled: boolean
  enterDetailsMembershipIdInputLocation: "form" | "join-card"
  variant: BookingFlowVariant
  routes: {
    myStay: LangRoute
    bookingTermsAndConditions: LangRoute
    membershipTermsAndConditions: LangRoute
    customerService: LangRoute
    privacyPolicy: LangRoute
  }
}

const getRef = cache(() => ({
  current: undefined as BookingFlowConfig | undefined,
}))

function setBookingFlowConfig(newConfig: BookingFlowConfig) {
  getRef().current = newConfig
}

export function getBookingFlowConfig(): BookingFlowConfig {
  const contextConfig = getRef().current

  if (!contextConfig) {
    throw new Error("BookingFlowConfig not set")
  }

  return contextConfig
}

/*
 * Sets up both a server side context and a client side context
 * for the booking flow config.
 */
export async function BookingFlowConfig({
  children,
  config,
}: {
  children: React.ReactNode
  config: BookingFlowConfig
}) {
  setBookingFlowConfig(config)

  return (
    <BookingFlowConfigContextProvider config={config}>
      {children}
    </BookingFlowConfigContextProvider>
  )
}
