import { notFound } from "next/navigation" import { getLocations } from "@/lib/trpc/memoizedRequests" import { generateChildrenString } from "@/components/HotelReservation/utils" import { convertSearchParamsToObj } from "@/utils/url" import type { SelectHotelSearchParams } from "@/types/components/hotelReservation/selectHotel/selectHotelSearchParams" import type { Child, SelectRateSearchParams, } from "@/types/components/hotelReservation/selectRate/selectRate" import type { Location } from "@/types/trpc/routers/hotel/locations" interface HotelSearchDetails { city: Location | null hotel: Location | null selectHotelParams: T adultsInRoom: number childrenInRoom?: string childrenInRoomArray?: Child[] } export async function getHotelSearchDetails< T extends SelectHotelSearchParams | SelectRateSearchParams, >({ searchParams, }: { searchParams: T & { [key: string]: string } }): Promise | null> { const selectHotelParams = convertSearchParamsToObj(searchParams) const locations = await getLocations() if (!locations || "error" in locations) return null const city = locations.data.find( (location) => location.name.toLowerCase() === selectHotelParams.city?.toLowerCase() ) const hotel = locations.data.find( (location) => "operaId" in location && location.operaId == selectHotelParams.hotelId ) if (!city && !hotel) return notFound() let adultsInRoom = 1 let childrenInRoom: string | undefined = undefined let childrenInRoomArray: Child[] | undefined = undefined const { rooms } = selectHotelParams if (rooms && rooms.length > 0) { adultsInRoom = rooms[0].adults // TODO: Handle multiple rooms childrenInRoom = rooms[0].children ? generateChildrenString(rooms[0].children) : undefined // TODO: Handle multiple rooms childrenInRoomArray = rooms[0].children ? rooms[0].children : undefined // TODO: Handle multiple rooms } return { city: city ?? null, hotel: hotel ?? null, selectHotelParams, adultsInRoom, childrenInRoom, childrenInRoomArray, } }