import type { imageSchema } from "@scandic-hotels/trpc/routers/hotels/schemas/image" import type { ProductTypeCheque } from "@scandic-hotels/trpc/types/availability" import type { Amenities } from "@scandic-hotels/trpc/types/hotel" import type { z } from "zod" import type { HotelResponse } from "../SelectHotel/helpers" type ImageSizes = z.infer["imageSizes"] type ImageMetaData = z.infer["metaData"] interface Coordinates { lat: number lng: number } export type HotelPin = { bookingCode?: string | null name: string coordinates: Coordinates chequePrice: ProductTypeCheque["localPrice"] | null publicPrice: number | null memberPrice: number | null redemptionPrice: number | null voucherPrice: number | null rateType: string | null currency: string images: { imageSizes: ImageSizes metaData: ImageMetaData }[] amenities: Amenities ratings: number | null operaId: string facilityIds: number[] hasEnoughPoints: boolean } export function getHotelPins( hotels: HotelResponse[], currencyValue?: string ): HotelPin[] { if (!hotels.length) { return [] } return hotels.map(({ availability, hotel, additionalData }) => { const productType = availability.productType const redemptionRate = productType?.redemptions?.find( (r) => r?.localPrice.pointsPerStay ) const chequePrice = productType?.bonusCheque?.localPrice const voucherPrice = productType?.voucher?.numberOfVouchers if (chequePrice || voucherPrice) { currencyValue = chequePrice ? "CC" : "Voucher" } return { bookingCode: availability.bookingCode, coordinates: { lat: hotel.location.latitude, lng: hotel.location.longitude, }, name: hotel.name, chequePrice: chequePrice ?? null, publicPrice: productType?.public?.localPrice.pricePerNight ?? null, memberPrice: productType?.member?.localPrice.pricePerNight ?? null, redemptionPrice: redemptionRate?.localPrice.pointsPerStay ?? null, voucherPrice: voucherPrice ?? null, rateType: productType?.public?.rateType ?? productType?.member?.rateType ?? null, currency: productType?.public?.localPrice.currency || productType?.member?.localPrice.currency || currencyValue || "N/A", images: [ hotel.hotelContent.images, ...(additionalData.gallery?.heroImages ?? []), ], amenities: hotel.detailedFacilities .map((facility) => ({ ...facility, icon: facility.icon ?? "None", })) .slice(0, 5), ratings: hotel.ratings?.tripAdvisor.rating ?? null, operaId: hotel.operaId, facilityIds: hotel.detailedFacilities.map((facility) => facility.id), hasEnoughPoints: !!availability.productType?.redemptions?.some( (r) => r.hasEnoughPoints ), } }) }