import { notFound } from "next/navigation"

import { getBookingConfirmation } from "@/lib/trpc/memoizedRequests"

import HotelDetails from "@/components/HotelReservation/BookingConfirmation/HotelDetails"
import PaymentDetails from "@/components/HotelReservation/BookingConfirmation/PaymentDetails"
import Promos from "@/components/HotelReservation/BookingConfirmation/Promos"
import Receipt from "@/components/HotelReservation/BookingConfirmation/Receipt"
import Rooms from "@/components/HotelReservation/BookingConfirmation/Rooms"
import SidePanel from "@/components/HotelReservation/SidePanel"
import Alert from "@/components/TempDesignSystem/Alert"
import Divider from "@/components/TempDesignSystem/Divider"
import { getIntl } from "@/i18n"
import BookingConfirmationProvider from "@/providers/BookingConfirmationProvider"

import Confirmation from "./Confirmation"
import Tracking from "./Tracking"
import { mapRoomState } from "./utils"

import styles from "./bookingConfirmation.module.css"

import type { BookingConfirmationProps } from "@/types/components/hotelReservation/bookingConfirmation/bookingConfirmation"
import { AlertTypeEnum } from "@/types/enums/alert"

export default async function BookingConfirmation({
  refId,
  membershipFailedError,
}: BookingConfirmationProps) {
  const bookingConfirmation = await getBookingConfirmation(refId)

  if (!bookingConfirmation) {
    return notFound()
  }

  const { booking, hotel, room, roomCategories } = bookingConfirmation

  if (!room) {
    return notFound()
  }

  const intl = await getIntl()
  return (
    <BookingConfirmationProvider
      bookingCode={booking.bookingCode}
      currencyCode={booking.currencyCode}
      fromDate={booking.checkInDate}
      toDate={booking.checkOutDate}
      roomCategories={roomCategories}
      rooms={[
        mapRoomState(booking, room, intl),
        // null represents "known but not yet fetched rooms" and is used to render placeholders correctly
        ...Array(booking.linkedReservations.length).fill(null),
      ]}
      vat={booking.vatPercentage}
    >
      <Confirmation booking={booking} hotel={hotel} room={room}>
        <div className={styles.booking}>
          {membershipFailedError && (
            <Alert
              type={AlertTypeEnum.Info}
              heading={intl.formatMessage({
                defaultMessage: "Failed to verify membership",
              })}
              text={intl.formatMessage({
                defaultMessage:
                  "Your booking(s) is confirmed but we could not verify your membership. If you have booked with a member discount, you'll either need to present your existing membership number upon check-in, become a member or pay the price difference at the hotel. Signing up is preferably done online before the stay.",
              })}
            />
          )}
          <Rooms
            booking={booking}
            checkInTime={hotel.hotelFacts.checkin.checkInTime}
            checkOutTime={hotel.hotelFacts.checkin.checkOutTime}
            mainRoom={room}
          />
          <PaymentDetails />
          <Divider color="primaryLightSubtle" />
          <HotelDetails hotel={hotel} />
          {hotel.specialAlerts.map((alert) => (
            <div key={alert.id}>
              <Alert
                type={alert.type}
                heading={alert.heading}
                text={alert.text}
              />
            </div>
          ))}
          <Promos booking={booking} />
          <div className={styles.mobileReceipt}>
            <Receipt />
          </div>
        </div>
        <aside className={styles.aside}>
          <SidePanel variant="receipt">
            <Receipt />
          </SidePanel>
        </aside>
      </Confirmation>
      <Tracking bookingConfirmation={bookingConfirmation} refId={refId} />
    </BookingConfirmationProvider>
  )
}
