import { serverClient } from "@/lib/trpc/server" import { getLang } from "@/i18n/serverContext" import { BedTypeEnum } from "@/types/components/bookingWidget/enums" import type { AvailabilityInput } from "@/types/components/hotelReservation/selectHotel/availabilityInput" import type { HotelData } from "@/types/components/hotelReservation/selectHotel/hotelCardListingProps" import type { Filter } from "@/types/components/hotelReservation/selectHotel/hotelFilters" import type { Child } from "@/types/components/hotelReservation/selectRate/selectRate" import { type PointOfInterest, PointOfInterestCategoryNameEnum, PointOfInterestGroupEnum, } from "@/types/hotel" export async function fetchAvailableHotels( input: AvailabilityInput ): Promise { const availableHotels = await serverClient().hotel.availability.hotels(input) if (!availableHotels) throw new Error() const language = getLang() const hotels = availableHotels.availability.map(async (hotel) => { const hotelData = await serverClient().hotel.hotelData.get({ hotelId: hotel.hotelId.toString(), language, }) if (!hotelData) throw new Error() return { hotelData: hotelData.data.attributes, price: hotel.bestPricePerNight, } }) return await Promise.all(hotels) } export function getFiltersFromHotels(hotels: HotelData[]) { const filters = hotels.flatMap((hotel) => hotel.hotelData.detailedFacilities) const uniqueFilterIds = [...new Set(filters.map((filter) => filter.id))] const filterList: Filter[] = uniqueFilterIds .map((filterId) => filters.find((filter) => filter.id === filterId)) .filter((filter): filter is Filter => filter !== undefined) return filterList } const bedTypeMap: Record = { [BedTypeEnum.IN_ADULTS_BED]: "ParentsBed", [BedTypeEnum.IN_CRIB]: "Crib", [BedTypeEnum.IN_EXTRA_BED]: "ExtraBed", } export function generateChildrenString(children: Child[]): string { return `[${children ?.map((child) => { const age = child.age const bedType = bedTypeMap[+child.bed] return `${age}:${bedType}` }) .join(",")}]` } export function getPointOfInterests(hotels: HotelData[]): PointOfInterest[] { // TODO: this is just a quick transformation to get something there. May need rework return hotels.map((hotel) => ({ coordinates: { lat: hotel.hotelData.location.latitude, lng: hotel.hotelData.location.longitude, }, name: hotel.hotelData.name, distance: hotel.hotelData.location.distanceToCentre, categoryName: PointOfInterestCategoryNameEnum.HOTEL, group: PointOfInterestGroupEnum.LOCATION, })) } export function getCentralCoordinates(pointOfInterests: PointOfInterest[]) { const centralCoordinates = pointOfInterests.reduce( (acc, poi) => { acc.lat += poi.coordinates.lat acc.lng += poi.coordinates.lng return acc }, { lat: 0, lng: 0 } ) centralCoordinates.lat /= pointOfInterests.length centralCoordinates.lng /= pointOfInterests.length return centralCoordinates }