import { CurrencyEnum } from "@scandic-hotels/common/constants/currency" import { formatPrice } from "@scandic-hotels/common/utils/numberFormatting" import type { IntlShape } from "react-intl" import type { Room } from "@/types/stores/my-stay" export function calculateTotalPrice( rooms: Room[], currency: CurrencyEnum, intl: IntlShape, allRoomsAreCancelled: boolean ) { const totals = rooms.reduce( (total, room) => { if (!allRoomsAreCancelled && room.isCancelled) { return total } if (room.cheques) { total.cheques = total.cheques + room.cheques } if (room.vouchers) { total.vouchers = total.vouchers + room.vouchers } if (room.totalPoints) { total.points = total.points + room.totalPoints } // room.totalPrice is a negative value when // its a vouchers booking (╯°□°)╯︵ ┻━┻ if (room.totalPrice && !room.vouchers) { total.cash = total.cash + room.totalPrice } return total }, { cash: 0, cheques: 0, points: 0, vouchers: 0, } ) let totalPrice = "" if (totals.cheques) { totalPrice = `${totals.cheques} ${CurrencyEnum.CC}` } if (totals.points) { const appendTotalPrice = totalPrice ? `${totalPrice} + ` : "" totalPrice = `${appendTotalPrice}${totals.points} ${CurrencyEnum.POINTS}` } if (totals.vouchers) { const appendTotalPrice = totalPrice ? `${totalPrice} + ` : "" totalPrice = `${appendTotalPrice}${totals.vouchers} ${intl.formatMessage( { defaultMessage: "{numberOfVouchers, plural, one {Voucher} other {Vouchers}}", }, { numberOfVouchers: totals.vouchers, } )}` } if (totals.cash) { const appendTotalPrice = totalPrice ? `${totalPrice} + ` : "" const cashPrice = formatPrice(intl, totals.cash, currency) totalPrice = `${appendTotalPrice}${cashPrice}` } return totalPrice } export function calculateTotalPoints( rooms: Room[], allRoomsAreCancelled: boolean ) { return rooms.reduce((total, room) => { if (!allRoomsAreCancelled && room.isCancelled) { return total } return total + room.totalPoints }, 0) } export function isAllRoomsCancelled(rooms: Room[]) { return !rooms.some((room) => room.isCancelled === false) }