import { cookies } from "next/headers"

import { FamilyAndFriendsCodes } from "@scandic-hotels/common/constants/familyAndFriends"
import { dt } from "@scandic-hotels/common/dt"
import { HotelInfoCard } from "@scandic-hotels/design-system/HotelInfoCard"

import { mapApiImagesToGalleryImages } from "../../misc/imageGallery"
import { filterOverlappingDates } from "../../utils/SelectRate"
import FnFNotAllowedAlert from "../FnFNotAllowedAlert"
import { HotelDetailsSidePeek } from "../HotelDetailsSidePeek"
import { AmenitiesSidePeekLabel } from "./AmenititesSidePeekLabel"
import AvailabilityError from "./AvailabilityError"
import { RoomsContainer } from "./RoomsContainer"

import type { RouterOutput } from "@scandic-hotels/trpc/client"

import type { SelectRateBooking } from "../../types/components/selectRate/selectRate"

export { SelectRateSkeleton } from "./SelectRateSkeleton"

export async function SelectRate({
  booking,
  hotelData,
}: {
  hotelData: NonNullable<RouterOutput["hotel"]["get"]>
  booking: SelectRateBooking
}) {
  const bookingCode = booking.bookingCode

  let isInValidFNF = false
  if (bookingCode && FamilyAndFriendsCodes.includes(bookingCode)) {
    const cookieStore = await cookies()
    isInValidFNF = cookieStore.get("sc")?.value !== "1"
  }

  const validAlerts = filterOverlappingDates(
    hotelData.hotel.specialAlerts.filter((alert) => alert.displayInBookingFlow),
    dt.utc(booking.fromDate),
    dt.utc(booking.toDate)
  )

  return (
    <>
      <HotelInfoCard
        hotel={{
          id: hotelData.hotel.id,
          name: hotelData.hotel.name,
          url: hotelData.url,
          ratings: hotelData.hotel.ratings,
        }}
        address={{
          streetAddress: hotelData.hotel.address.streetAddress,
          city: hotelData.hotel.address.city,
          kilometersToCentre: hotelData.hotel.location.distanceToCentre / 1000,
        }}
        galleryImages={mapApiImagesToGalleryImages(
          hotelData.hotel.galleryImages
        )}
        description={
          hotelData.hotel.hotelContent.texts.descriptions?.medium ?? ""
        }
        alerts={validAlerts.map((alert) => ({
          ...alert,
          heading: alert.heading ?? "",
          text: alert.text ?? "",
        }))}
        facilities={hotelData.hotel.detailedFacilities}
        slot={
          <HotelDetailsSidePeek
            hotel={{
              ...hotelData.hotel,
              url: hotelData.url,
            }}
            restaurants={hotelData.restaurants}
            additionalHotelData={hotelData.additionalData}
            triggerLabel={<AmenitiesSidePeekLabel />}
            buttonVariant="primary"
          />
        }
      />

      {isInValidFNF ? (
        <FnFNotAllowedAlert />
      ) : (
        <RoomsContainer
          hotelType={hotelData.hotel.hotelType}
          roomCategories={hotelData.roomCategories}
          vat={hotelData.hotel.vat}
        />
      )}

      <AvailabilityError booking={booking} hotelName={hotelData.hotel.name} />
    </>
  )
}
