import * as Sentry from "@sentry/nextjs"

import {
  GetAccountPageSettings,
  GetCampaignPageSettings,
  GetCollectionPageSettings,
  GetContentPageSettings,
  GetCurrentBlocksPageSettings,
  GetDestinationCityPageSettings,
  GetDestinationCountryPageSettings,
  GetDestinationOverviewPageSettings,
  GetHotelPageSettings,
  GetLoyaltyPageSettings,
  GetStartPageSettings,
} from "@/lib/graphql/Query/PageSettings.graphql"
import { request } from "@/lib/graphql/request"
import { contentstackBaseProcedure, router } from "@/server/trpc"
import { langInput } from "@/server/utils"

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

import {
  DEFAULT_GET_PAGE_SETTINGS,
  type GetPageSettingsSchema,
  getPageSettingsSchema,
} from "./output"
import { affix } from "./utils"

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

export const pageSettingsQueryRouter = router({
  get: contentstackBaseProcedure
    .input(langInput)
    .query(async ({ input, ctx }): Promise<GetPageSettingsSchema> => {
      const { contentType, uid } = ctx
      const lang = input.lang ?? ctx.lang

      // This condition is to handle 404 page case and booking flow
      if (!contentType || !uid) {
        return DEFAULT_GET_PAGE_SETTINGS
      }

      const getPageSettingsQuery =
        graphqlQueriesForContentType[contentType as PageContentTypeEnum]

      if (!getPageSettingsQuery) {
        Sentry.captureMessage(
          `GetPageSettings: No proper Content type defined for '${contentType}'`
        )
        return DEFAULT_GET_PAGE_SETTINGS
      }

      const response = await request<GetPageSettingsSchema>(
        getPageSettingsQuery,
        {
          uid: uid,
          locale: lang,
        },
        {
          key: generateTag(lang, uid, affix),
          ttl: "max",
        }
      )

      try {
        const result = getPageSettingsSchema.parse(response.data)
        return result
      } catch (error) {
        Sentry.captureException(error, { extra: { uid, contentType } })

        return DEFAULT_GET_PAGE_SETTINGS
      }
    }),
})

const graphqlQueriesForContentType: Record<PageContentTypeEnum, any> = {
  [PageContentTypeEnum.accountPage]: GetAccountPageSettings,
  [PageContentTypeEnum.campaignPage]: GetCampaignPageSettings,
  [PageContentTypeEnum.collectionPage]: GetCollectionPageSettings,
  [PageContentTypeEnum.contentPage]: GetContentPageSettings,
  [PageContentTypeEnum.currentBlocksPage]: GetCurrentBlocksPageSettings,
  [PageContentTypeEnum.destinationCityPage]: GetDestinationCityPageSettings,
  [PageContentTypeEnum.destinationCountryPage]:
    GetDestinationCountryPageSettings,
  [PageContentTypeEnum.destinationOverviewPage]:
    GetDestinationOverviewPageSettings,
  [PageContentTypeEnum.hotelPage]: GetHotelPageSettings,
  [PageContentTypeEnum.loyaltyPage]: GetLoyaltyPageSettings,
  [PageContentTypeEnum.startPage]: GetStartPageSettings,
}
