"use client"
import { useEffect } from "react"
import { useIntl } from "react-intl"
import {
Discount22Icon,
MaterialIcon,
} from "@scandic-hotels/design-system/Icons"
import { Typography } from "@scandic-hotels/design-system/Typography"
import { BookingStatusEnum } from "@/constants/booking"
import { dt } from "@/lib/dt"
import { useMyStayRoomDetailsStore } from "@/stores/my-stay/myStayRoomDetailsStore"
import { useMyStayTotalPriceStore } from "@/stores/my-stay/myStayTotalPrice"
import Button from "@/components/TempDesignSystem/Button"
import Divider from "@/components/TempDesignSystem/Divider"
import IconChip from "@/components/TempDesignSystem/IconChip"
import Link from "@/components/TempDesignSystem/Link"
import Subtitle from "@/components/TempDesignSystem/Text/Subtitle"
import { useGuaranteePaymentFailedToast } from "@/hooks/booking/useGuaranteePaymentFailedToast"
import useLang from "@/hooks/useLang"
import ManageStay from "../ManageStay"
import TotalPrice from "../Rooms/TotalPrice"
import { mapRoomDetails } from "../utils/mapRoomDetails"
import ReferenceCardSkeleton from "./ReferenceCardSkeleton"
import styles from "./referenceCard.module.css"
import type { Hotel, Room } from "@/types/hotel"
import type { BookingConfirmation } from "@/types/trpc/routers/booking/confirmation"
import type { CreditCard } from "@/types/user"
interface ReferenceCardProps {
booking: BookingConfirmation["booking"]
hotel: Hotel
room:
| (Room & {
bedType: Room["roomTypes"][number]
})
| null
savedCreditCards: CreditCard[] | null
refId: string
isLoggedIn: boolean
}
export function ReferenceCard({
booking,
hotel,
room,
savedCreditCards,
refId,
isLoggedIn,
}: ReferenceCardProps) {
const intl = useIntl()
const lang = useLang()
const bookedRoom = useMyStayRoomDetailsStore((state) => state.bookedRoom)
const linkedReservationRooms = useMyStayRoomDetailsStore(
(state) => state.linkedReservationRooms
)
const addBookedRoom = useMyStayRoomDetailsStore(
(state) => state.actions.addBookedRoom
)
const addRoomPrice = useMyStayTotalPriceStore(
(state) => state.actions.addRoomPrice
)
// Initialize store with server data
useEffect(() => {
// Add price and details for booked room (main room or single room)
addRoomPrice({
id: booking.confirmationNumber,
totalPrice:
booking.reservationStatus === BookingStatusEnum.Cancelled
? 0
: booking.totalPrice,
currencyCode: booking.currencyCode,
isMainBooking: true,
roomPoints: booking.roomPoints,
})
addBookedRoom(
mapRoomDetails({
booking,
room,
roomNumber: 1,
})
)
}, [booking, room, addBookedRoom, addRoomPrice])
useGuaranteePaymentFailedToast()
if (!bookedRoom.roomNumber) return
{intl.formatMessage({ id: "Guests" })}
{allRooms.length > 1 ? children > 0 ? adultsAndChildrenAndRoomsMsg : adultsAndRoomsMsg : children > 0 ? adultsAndChildrenMsg : adultsOnlyMsg}
{intl.formatMessage({ id: "Cancellation" })}
{isMultiRoom ? `${cancelledRoomsMsg} ${intl.formatMessage({ id: "cancelled" })}` : roomCancelledRoomsMsg}
{intl.formatMessage({ id: "Check-in" })}
{`${dt(booking.checkInDate).locale(lang).format("dddd, D MMMM")} ${intl.formatMessage({ id: "from" })} ${hotel.hotelFacts.checkin.checkInTime}`}
{intl.formatMessage({ id: "Check-out" })}
{`${dt(booking.checkOutDate).locale(lang).format("dddd, D MMMM")} ${intl.formatMessage({ id: "until" })} ${hotel.hotelFacts.checkin.checkOutTime}`}
{intl.formatMessage({ id: "Booking guaranteed." })} {" "} {intl.formatMessage({ id: "Your stay remains available for check-in after 18:00.", })}
{intl.formatMessage({ id: "Total" })}
{intl.formatMessage({ id: "Booking code" })}
{intl.formatMessage({ id: "Booking code" })}:{" "} {bookingCode}
{intl.formatMessage({ id: "Multi-room stay" })}
{rateDefinition.generalTerms.map((term) => ( {term} {term.endsWith(".") ? " " : ". "} ))}