"use client"
import { type IntlShape, useIntl } from "react-intl"

import { CurrencyEnum } from "@scandic-hotels/common/constants/currency"
import { PointType } from "@scandic-hotels/common/constants/pointType"
import { formatPrice } from "@scandic-hotels/common/utils/numberFormatting"

import BoldRow from "../Bold"
import RegularRow from "../Regular"
import BedTypeRow from "./BedType"
import PackagesRow from "./Packages"

import type { SharedPriceRowProps } from "./price"

export interface RedemptionPriceType {
  redemption?: {
    additionalPricePerStay?: number
    currency?: CurrencyEnum
    pointsPerNight: number
    pointsPerStay: number
    pointsType: PointType
  }
}

interface RedemptionPriceProps extends SharedPriceRowProps {
  currency: CurrencyEnum
  nights: number
  price: RedemptionPriceType["redemption"]
}

export default function RedemptionPrice({
  bedType,
  currency,
  nights,
  packages,
  price,
}: RedemptionPriceProps) {
  const intl = useIntl()

  if (!price) {
    return null
  }

  const averagePriceTitle = intl.formatMessage({
    id: "priceDetails.averagePricePerNight",
    defaultMessage: "Average price per night",
  })

  const additionalPricePerStay = price.additionalPricePerStay

  const averageAdditionalPricePerNight = additionalPricePerStay
    ? Math.ceil(additionalPricePerStay / nights)
    : null

  const actualCurrency = price.currency || currency
  const formattedCurrency = getCurrencyText(
    price.pointsPerStay,
    actualCurrency,
    price.pointsType,
    intl
  )

  let averagePricePerNight = `${price.pointsPerNight} ${formattedCurrency}`
  if (averageAdditionalPricePerNight) {
    averagePricePerNight = `${averagePricePerNight} + ${averageAdditionalPricePerNight} ${formattedCurrency}`
  }

  return (
    <>
      <BoldRow
        label={intl.formatMessage({
          id: "priceDetails.roomCharge",
          defaultMessage: "Room charge",
        })}
        value={formatPrice(
          intl,
          price.pointsPerStay,
          currency,
          additionalPricePerStay,
          formattedCurrency,
          price.pointsType
        )}
      />
      {nights > 1 ? (
        <RegularRow label={averagePriceTitle} value={averagePricePerNight} />
      ) : null}
      <BedTypeRow bedType={bedType} currency={currency} />
      <PackagesRow packages={packages} />
    </>
  )
}

function getCurrencyText(
  points: number,
  currency: CurrencyEnum | undefined,
  pointsType: PointType,
  intl: IntlShape
) {
  if (!currency) return currency

  if (currency === CurrencyEnum.POINTS) {
    switch (pointsType) {
      case PointType.SCANDIC: {
        return intl.formatMessage(
          {
            id: "price.numberOfScandicPoints",
            defaultMessage:
              "{numberOfScandicPoints, plural, one {Point} other {Points}}",
          },
          {
            numberOfScandicPoints: points,
          }
        )
      }
      case PointType.EUROBONUS: {
        return intl.formatMessage(
          {
            id: "price.numberOfEuroBonusPoints",
            defaultMessage:
              "{numberOfEuroBonusPoints, plural, one {EB Point} other {EB Points}}",
          },
          {
            numberOfEuroBonusPoints: points,
          }
        )
      }
      default: {
        const _exhaustiveCheck: never = pointsType
        return currency
      }
    }
  }

  return currency
}
