"use client"

import { useSession } from "next-auth/react"
import { useState } from "react"
import { useIntl } from "react-intl"

import { selectRate } from "@scandic-hotels/common/constants/routes/hotelReservation"
import Caption from "@scandic-hotels/design-system/Caption"
import { FacilityToIcon } from "@scandic-hotels/design-system/FacilityToIcon"
import { HotelCardDialogImage } from "@scandic-hotels/design-system/HotelCard/HotelCardDialogImage"
import { HotelPointsRow } from "@scandic-hotels/design-system/HotelCard/HotelPointsRow"
import { NoPriceAvailableCard } from "@scandic-hotels/design-system/HotelCard/NoPriceAvailableCard"
import { IconButton } from "@scandic-hotels/design-system/IconButton"
import { MaterialIcon } from "@scandic-hotels/design-system/Icons/MaterialIcon"
import Link from "@scandic-hotels/design-system/Link"
import { OldDSButton as Button } from "@scandic-hotels/design-system/OldDSButton"
import Subtitle from "@scandic-hotels/design-system/Subtitle"
import { Typography } from "@scandic-hotels/design-system/Typography"

import useLang from "@/hooks/useLang"
import { isValidClientSession } from "@/utils/clientSession"

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

import type { HotelPin } from "@/types/components/hotelReservation/selectHotel/map"

interface ListingHotelCardProps {
  data: HotelPin
  handleClose: () => void
}

export default function ListingHotelCardDialog({
  data,
  handleClose,
}: ListingHotelCardProps) {
  const intl = useIntl()
  const lang = useLang()

  const [imageError, setImageError] = useState(false)

  const { data: session } = useSession()
  const isUserLoggedIn = isValidClientSession(session)
  const {
    bookingCode,
    name,
    publicPrice,
    memberPrice,
    currency,
    amenities,
    images,
    ratings,
    operaId,
    redemptionPrice,
    chequePrice,
    voucherPrice,
    hasEnoughPoints,
  } = data
  const firstImage = images[0]?.imageSizes?.small
  const altText = images[0]?.metaData?.altText

  const notEnoughPointsLabel = intl.formatMessage({
    defaultMessage: "Not enough points",
  })
  const shouldShowNotEnoughPoints = redemptionPrice && !hasEnoughPoints

  return (
    <div className={styles.container}>
      <IconButton
        theme="Black"
        style="Muted"
        className={styles.closeButton}
        onPress={handleClose}
        aria-label={intl.formatMessage({
          defaultMessage: "Close",
        })}
      >
        <MaterialIcon icon="close" size={22} color="CurrentColor" />
      </IconButton>
      <div className={styles.content}>
        <div className={styles.header}>
          <HotelCardDialogImage
            firstImage={firstImage}
            altText={altText}
            rating={{ tripAdvisor: ratings }}
            imageError={imageError}
            setImageError={setImageError}
            position="top"
          />
          <div>
            <div className={styles.name}>
              <Subtitle type="two">{name}</Subtitle>
            </div>
            <div className={styles.facilities}>
              {amenities.map((facility) => (
                <div key={facility.id}>
                  <FacilityToIcon
                    id={facility.id}
                    size={20}
                    color="Icon/Default"
                  />
                </div>
              ))}
            </div>
          </div>
        </div>

        {publicPrice ||
        memberPrice ||
        redemptionPrice ||
        voucherPrice ||
        chequePrice ? (
          <div className={styles.bottomContainer}>
            <div className={styles.pricesContainer}>
              {redemptionPrice ? (
                <Caption color="uiTextHighContrast">
                  {intl.formatMessage({
                    defaultMessage: "Available rates",
                  })}
                </Caption>
              ) : (
                <Caption color="uiTextHighContrast">
                  {intl.formatMessage({
                    defaultMessage: "Per night from",
                  })}
                </Caption>
              )}
              <div className={styles.listingPrices}>
                {publicPrice && !isUserLoggedIn && memberPrice ? (
                  <>
                    <Subtitle type="two">
                      {publicPrice} {currency}
                    </Subtitle>
                    {/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */}
                    {memberPrice && <Caption>/</Caption>}
                  </>
                ) : (
                  bookingCode &&
                  publicPrice && (
                    <Subtitle type="two" color="red">
                      {publicPrice} {currency}
                    </Subtitle>
                  )
                )}
                {memberPrice && (
                  <Subtitle type="two" color="red">
                    {intl.formatMessage(
                      {
                        defaultMessage: "{price} {currency}",
                      },
                      {
                        price: memberPrice,
                        currency,
                      }
                    )}
                  </Subtitle>
                )}
                {redemptionPrice && (
                  <HotelPointsRow pointsPerStay={redemptionPrice} />
                )}
                {chequePrice && (
                  <Subtitle type="two">
                    {intl.formatMessage(
                      {
                        defaultMessage: "{price} {currency}",
                      },
                      {
                        price: chequePrice.numberOfCheques,
                        currency: "CC",
                      }
                    )}
                    {chequePrice.additionalPricePerStay > 0
                      ? // eslint-disable-next-line formatjs/no-literal-string-in-jsx
                        " + " +
                        intl.formatMessage(
                          {
                            defaultMessage: "{price} {currency}",
                          },
                          {
                            price: chequePrice.additionalPricePerStay,
                            currency: chequePrice.currency,
                          }
                        )
                      : null}
                    <Typography variant="Body/Paragraph/mdRegular">
                      {/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */}
                      <span>
                        /
                        {intl.formatMessage({
                          defaultMessage: "night",
                        })}
                      </span>
                    </Typography>
                  </Subtitle>
                )}
                {voucherPrice && (
                  <Subtitle type="two">
                    {intl.formatMessage(
                      {
                        defaultMessage: "{price} {currency}",
                      },
                      {
                        price: voucherPrice,
                        currency,
                      }
                    )}
                    <Typography variant="Body/Paragraph/mdRegular">
                      {/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */}
                      <span>
                        /
                        {intl.formatMessage({
                          defaultMessage: "night",
                        })}
                      </span>
                    </Typography>
                  </Subtitle>
                )}
              </div>
            </div>
            {shouldShowNotEnoughPoints ? (
              <div className={styles.notEnoughPointsButton}>
                <Typography variant="Body/Paragraph/mdBold">
                  <span>{notEnoughPointsLabel}</span>
                </Typography>
              </div>
            ) : (
              <Button
                asChild
                theme="base"
                size="small"
                className={styles.button}
              >
                <Link
                  href={`${selectRate(lang)}?hotel=${operaId}`}
                  color="none"
                  keepSearchParams
                >
                  {intl.formatMessage({
                    defaultMessage: "See rooms",
                  })}
                </Link>
              </Button>
            )}
          </div>
        ) : (
          <NoPriceAvailableCard />
        )}
      </div>
    </div>
  )
}
