import { dt } from "@/lib/dt" import type { UseFormReturn } from "react-hook-form" import type { IntlShape } from "react-intl" import type { FormValues } from "@/types/components/hotelReservation/myStay/cancelStay" import type { BookingConfirmation } from "@/types/trpc/routers/booking/confirmation" export function getDefaultRooms(booking: BookingConfirmation["booking"]) { const { multiRoom, confirmationNumber, linkedReservations = [] } = booking if (!multiRoom) { return [{ id: "1", checked: true, confirmationNumber }] } const mainRoom = { id: "1", checked: false, confirmationNumber } const linkedRooms = linkedReservations.map((reservation, index) => ({ id: `${index + 2}`, checked: false, confirmationNumber: reservation.confirmationNumber, })) return [mainRoom, ...linkedRooms] } export function formatStayDetails({ booking, lang, intl, }: { booking: BookingConfirmation["booking"] lang: string intl: IntlShape }) { const { multiRoom } = booking const totalAdults = multiRoom ? (booking.adults ?? 0) + (booking.linkedReservations ?? []).reduce((acc, reservation) => { return acc + (reservation.adults ?? 0) }, 0) : (booking.adults ?? 0) const totalChildren = multiRoom ? booking.childrenAges?.length + (booking.linkedReservations ?? []).reduce((acc, reservation) => { return acc + reservation.children }, 0) : booking.childrenAges?.length const checkInDate = dt(booking.checkInDate) .locale(lang) .format("dddd D MMM YYYY") const checkOutDate = dt(booking.checkOutDate) .locale(lang) .format("dddd D MMM YYYY") const diff = dt(checkOutDate).diff(checkInDate, "days") const nightsText = intl.formatMessage( { id: "{totalNights, plural, one {# night} other {# nights}}" }, { totalNights: diff } ) const adultsText = intl.formatMessage( { id: "{totalAdults, plural, one {# adult} other {# adults}}" }, { totalAdults: totalAdults } ) const childrenText = intl.formatMessage( { id: "{totalChildren, plural, one {# child} other {# children}}" }, { totalChildren: totalChildren } ) return { checkInDate, checkOutDate, nightsText, adultsText, childrenText, } } function getMatchedRooms( booking: BookingConfirmation["booking"], checkedConfirmationNumbers: string[] ) { let matchedRooms = [] // Main booking if (checkedConfirmationNumbers.includes(booking.confirmationNumber ?? "")) { matchedRooms.push({ adults: booking.adults ?? 0, children: booking.childrenAges?.length ?? 0, }) } // Linked reservations if (booking.linkedReservations) { const matchedLinkedRooms = booking.linkedReservations .filter((reservation) => checkedConfirmationNumbers.includes(reservation.confirmationNumber) ) .map((reservation) => ({ adults: reservation.adults ?? 0, children: reservation.children ?? 0, })) matchedRooms = [...matchedRooms, ...matchedLinkedRooms] } return matchedRooms } function calculateTotals(matchedRooms: { adults: number; children: number }[]) { const totalAdults = matchedRooms.reduce((sum, room) => sum + room.adults, 0) const totalChildren = matchedRooms.reduce( (sum, room) => sum + room.children, 0 ) return { totalAdults, totalChildren } } export const getCheckedRoomsCounts = ( booking: BookingConfirmation["booking"], getValues: UseFormReturn["getValues"], intl: IntlShape ) => { const formRooms = getValues("rooms") const checkedFormRooms = formRooms.filter((room) => room.checked) const checkedConfirmationNumbers = checkedFormRooms .map((room) => room.confirmationNumber) .filter( (confirmationNumber): confirmationNumber is string => confirmationNumber !== null && confirmationNumber !== undefined ) const matchedRooms = getMatchedRooms(booking, checkedConfirmationNumbers) const { totalAdults, totalChildren } = calculateTotals(matchedRooms) const adultsText = intl.formatMessage( { id: "{totalAdults, plural, one {# adult} other {# adults}}" }, { totalAdults: totalAdults } ) const childrenText = intl.formatMessage( { id: "{totalChildren, plural, one {# child} other {# children}}" }, { totalChildren: totalChildren } ) return { adultsText, childrenText, totalChildren } }