import { ValueOf } from "next/dist/shared/lib/constants"

import {
  GetAccountPageSettings,
  GetCollectionPageSettings,
  GetContentPageSettings,
  GetCurrentBlocksPageSettings,
  GetHotelPageSettings,
  GetLoyaltyPageSettings,
} from "@/lib/graphql/Query/BookingWidgetToggle.graphql"
import { request } from "@/lib/graphql/request"
import { contentstackBaseProcedure, router } from "@/server/trpc"

import { generateTag } from "@/utils/generateTag"

import {
  validateBookingWidgetToggleSchema,
  ValidateBookingWidgetToggleType,
} from "./output"
import { affix as bookingwidgetAffix } from "./utils"

import { ContentTypeEnum } from "@/types/requests/contentType"

export const bookingwidgetQueryRouter = router({
  toggle: router({
    get: contentstackBaseProcedure.query(async ({ ctx }) => {
      const failedResponse = { hideBookingWidget: false }
      const { contentType, uid, lang } = ctx

      // This condition is to handle 404 page case and booking flow
      if (!contentType || !uid) {
        console.log("No proper params defined: ", contentType, uid)
        return failedResponse
      }
      let GetPageSettings = ""
      const contentTypeCMS = <ValueOf<typeof ContentTypeEnum>>(
        contentType.replaceAll("-", "_")
      )

      switch (contentTypeCMS) {
        case ContentTypeEnum.accountPage:
          GetPageSettings = GetAccountPageSettings
          break
        case ContentTypeEnum.loyaltyPage:
          GetPageSettings = GetLoyaltyPageSettings
          break
        case ContentTypeEnum.collectionPage:
          GetPageSettings = GetCollectionPageSettings
          break
        case ContentTypeEnum.contentPage:
          GetPageSettings = GetContentPageSettings
          break
        case ContentTypeEnum.hotelPage:
          GetPageSettings = GetHotelPageSettings
          break
        case ContentTypeEnum.currentBlocksPage:
          GetPageSettings = GetCurrentBlocksPageSettings
          break
      }

      if (!GetPageSettings) {
        console.error("No proper Content type defined: ", contentType)
        return failedResponse
      }

      const response = await request<ValidateBookingWidgetToggleType>(
        GetPageSettings,
        {
          uid: uid,
          locale: lang,
        },
        {
          next: {
            tags: [generateTag(lang, uid, bookingwidgetAffix)],
          },
        }
      )

      const bookingWidgetToggleData =
        validateBookingWidgetToggleSchema.safeParse(response.data)
      if (!bookingWidgetToggleData.success) {
        console.error(
          "Flag hide_booking_widget fetch error: ",
          bookingWidgetToggleData.error
        )
        return failedResponse
      }

      const hideBookingWidget =
        !!bookingWidgetToggleData.data[contentTypeCMS]?.page_settings
          ?.hide_booking_widget

      return {
        hideBookingWidget,
      }
    }),
  }),
})
