import { differenceInCalendarDays, format, isWeekend } from "date-fns" import { TrackingChannelEnum, type TrackingSDKHotelInfo, type TrackingSDKPageData, } from "@scandic-hotels/tracking/types" import { ChildBedMapEnum } from "@scandic-hotels/trpc/enums/childBedMapEnum" import type { Lang } from "@scandic-hotels/common/constants/language" import type { Child } from "@scandic-hotels/trpc/types/child" import type { BookingFlowConfig } from "../bookingFlowConfig/bookingFlowConfig" import type { SelectHotelBooking } from "../utils/url" type ChildrenInRoom = (Child[] | null)[] | null type SelectHotelTrackingInput = { lang: Lang pageId: string pageName: string siteSections: string arrivalDate: Date departureDate: Date rooms: SelectHotelBooking["rooms"] hotelsResult: number country: string | undefined hotelCity: string | undefined bookingCode?: string searchTerm?: string isBookingCodeRateAvailable?: boolean isRedemption?: boolean isRedemptionAvailable?: boolean config: Pick } export function getSelectHotelTracking({ lang, pageId, pageName, siteSections, arrivalDate, departureDate, rooms, hotelsResult, country, hotelCity, searchTerm, bookingCode, config, isBookingCodeRateAvailable = false, isRedemption = false, isRedemptionAvailable = false, }: SelectHotelTrackingInput): { hotelsTrackingData: TrackingSDKHotelInfo pageTrackingData: TrackingSDKPageData } { const pageTrackingData: TrackingSDKPageData = { channel: TrackingChannelEnum["hotelreservation"], domainLanguage: lang, pageId, pageName, pageType: "bookinghotelspage", siteSections, siteVersion: "new-web", } let adultsInRoom: number[] = [] let childrenInRoom: ChildrenInRoom = null if (rooms?.length) { adultsInRoom = rooms.map((room) => room.adults ?? 0) childrenInRoom = rooms.map((room) => room.childrenInRoom ?? null) } const bookingCodeProperties = { bookingCode: bookingCode ?? "n/a", bookingCodeAvailability: bookingCode ? isBookingCodeRateAvailable.toString() : undefined, } const hotelsTrackingData: TrackingSDKHotelInfo = { ageOfChildren: childrenInRoom ?.map((c) => c?.map((k) => k.age).join(",") ?? "") .join("|"), arrivalDate: format(arrivalDate, "yyyy-MM-dd"), availableResults: hotelsResult, ...(config.bookingCodeEnabled ? bookingCodeProperties : {}), bookingTypeofDay: isWeekend(arrivalDate) ? "weekend" : "weekday", childBedPreference: childrenInRoom ?.map((c) => c?.map((k) => ChildBedMapEnum[k.bed]).join(",") ?? "") .join("|"), country, departureDate: format(departureDate, "yyyy-MM-dd"), duration: differenceInCalendarDays(departureDate, arrivalDate), leadTime: differenceInCalendarDays(arrivalDate, new Date()), noOfAdults: adultsInRoom.join(","), noOfChildren: childrenInRoom?.map((kids) => kids?.length ?? 0).join(","), noOfRooms: rooms?.length ?? 0, region: hotelCity, rewardNight: isRedemption ? "yes" : "no", rewardNightAvailability: isRedemptionAvailable.toString(), searchTerm, searchType: "destination", } return { hotelsTrackingData, pageTrackingData, } }