import { differenceInCalendarDays, format, isWeekend } from "date-fns" import { ChildBedMapEnum } from "@scandic-hotels/trpc/enums/childBedMapEnum" import type { Lang } from "@scandic-hotels/common/constants/language" import type { SelectHotelBooking } from "@/types/components/hotelReservation/selectHotel/selectHotel" import { TrackingChannelEnum, type TrackingSDKHotelInfo, type TrackingSDKPageData, } from "@/types/components/tracking" import type { ChildrenInRoom } from "@/utils/hotelSearchDetails" 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 } export function getSelectHotelTracking({ lang, pageId, pageName, siteSections, arrivalDate, departureDate, rooms, hotelsResult, country, hotelCity, searchTerm, bookingCode, isBookingCodeRateAvailable = false, isRedemption = false, isRedemptionAvailable = false, }: SelectHotelTrackingInput) { 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 hotelsTrackingData: TrackingSDKHotelInfo = { ageOfChildren: childrenInRoom ?.map((c) => c?.map((k) => k.age).join(",") ?? "") .join("|"), arrivalDate: format(arrivalDate, "yyyy-MM-dd"), availableResults: hotelsResult, bookingCode: bookingCode ?? "n/a", bookingCodeAvailability: bookingCode ? isBookingCodeRateAvailable.toString() : undefined, 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, } }