import { cx } from 'class-variance-authority'

import { Typography } from '../../Typography'
import { Rate, RateTermDetails } from '../types'

import { IconButton } from '../../IconButton'
import { MaterialIcon } from '../../Icons/MaterialIcon'
import Modal from '../Modal'
import styles from '../rate-card.module.css'
import { variants } from '../variants'
import { Button as ButtonRAC } from 'react-aria-components'
import { useIntl } from 'react-intl'

interface CampaignRateCardProps {
  id: string
  isSelected: boolean
  rateTitle: string
  paymentTerm: string
  bannerText: string
  rate: Rate
  memberRate?: Rate
  omnibusRate?: Rate
  comparisonRate?: Omit<Rate, 'label'>
  isHighlightedRate?: boolean
  isHighlightedRateLabel?: boolean
  approximateRate?: Rate
  roomTypeCode: string
  handleChange: () => void
  handleTermsClick?: () => void
  rateTermDetails: RateTermDetails[]
}

export default function CampaignRateCard({
  id,
  isSelected,
  rateTitle,
  paymentTerm,
  rate,
  roomTypeCode,
  memberRate,
  approximateRate,
  comparisonRate,
  omnibusRate,
  bannerText,
  isHighlightedRate,
  isHighlightedRateLabel,
  handleChange,
  rateTermDetails,
}: CampaignRateCardProps) {
  const classNames = variants({
    variant: 'Campaign',
  })

  const intl = useIntl()
  return (
    <div
      className={cx(classNames, {
        [styles.selected]: isSelected,
      })}
    >
      <ButtonRAC
        onPress={handleChange}
        className={styles.buttonOverlay}
        aria-pressed={isSelected}
        aria-describedby={`${roomTypeCode} ${id}-title`}
        aria-labelledby={`${id}-details`}
      />
      <div className={styles.banner}>
        <MaterialIcon size={16} icon="sell" color="CurrentColor" />
        <Typography variant="Label/xsBold">
          <p>{bannerText}</p>
        </Typography>
      </div>
      <div className={styles.container}>
        <Typography variant="Tag/sm">
          <h3 className={styles.title}>
            <Modal
              title={rateTitle}
              subtitle={paymentTerm}
              trigger={
                <IconButton
                  theme="Black"
                  style="Muted"
                  wrapping
                  className={styles.triggerButton}
                  aria-label={intl.formatMessage({
                    id: 'selectRate.rateCard.openReservationPolicy',
                    defaultMessage: 'Open reservation policy',
                  })}
                >
                  <MaterialIcon icon="info" size={20} color="Icon/Default" />
                </IconButton>
              }
            >
              {rateTermDetails.map((termGroup) => (
                <div key={termGroup.title} className={styles.terms}>
                  <Typography variant="Body/Paragraph/mdBold">
                    <p>{termGroup.title}</p>
                  </Typography>
                  {termGroup.terms.map((term) => (
                    <Typography key={term}>
                      <p className={styles.term}>
                        <MaterialIcon
                          icon="check"
                          color="Icon/Feedback/Success"
                          size={20}
                          className={styles.termsIcon}
                        />
                        {term}
                      </p>
                    </Typography>
                  ))}
                </div>
              ))}
            </Modal>
            <span id={`${id}-title`}>
              {rateTitle}
              <span className={styles.textSecondary}>
                {/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */}
                {` / ${paymentTerm}`}
              </span>
            </span>
          </h3>
        </Typography>
        <div className={styles.content} id={`${id}-details`}>
          <div
            className={cx(styles.rateRow, {
              [styles.highlightedRate]: isHighlightedRateLabel,
            })}
          >
            <Typography variant="Body/Supporting text (caption)/smBold">
              <p>{rate.label}</p>
            </Typography>
            <Typography variant="Title/Subtitle/md">
              <p
                className={cx({
                  [styles.highlightedRate]: isHighlightedRate,
                })}
              >
                {/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */}
                {`${rate.price} `}
                <Typography variant="Body/Supporting text (caption)/smBold">
                  <span>{rate.unit}</span>
                </Typography>
              </p>
            </Typography>
          </div>
          {memberRate ? (
            <div className={`${styles.rateRow} ${styles.highlightedRate}`}>
              <Typography variant="Body/Supporting text (caption)/smBold">
                <p>{memberRate.label}</p>
              </Typography>
              <Typography variant="Title/Subtitle/md">
                <p>
                  {/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */}
                  {`${memberRate.price} `}
                  <Typography variant="Body/Supporting text (caption)/smBold">
                    <span>{memberRate.unit}</span>
                  </Typography>
                </p>
              </Typography>
            </div>
          ) : null}
          {comparisonRate ? (
            <div className={`${styles.rateRow} ${styles.comparisonRate}`}>
              <Typography variant="Title/Subtitle/md">
                <p>
                  <span className={styles.strikethrough}>
                    {comparisonRate.price}
                    {/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */}
                  </span>{' '}
                  <Typography variant="Body/Supporting text (caption)/smBold">
                    <span className={styles.strikethrough}>
                      {comparisonRate.unit}
                    </span>
                  </Typography>
                </p>
              </Typography>
            </div>
          ) : null}
          {approximateRate ? (
            <div className={`${styles.rateRow} ${styles.approximateRate}`}>
              <Typography variant="Body/Supporting text (caption)/smRegular">
                <p>{approximateRate.label}</p>
              </Typography>
              <Typography variant="Body/Supporting text (caption)/smRegular">
                <p>
                  {approximateRate.price} {approximateRate.unit}
                </p>
              </Typography>
            </div>
          ) : null}
        </div>
        {omnibusRate ? (
          <footer className={styles.footer}>
            <Typography variant="Tag/sm">
              <p>{omnibusRate.label}</p>
            </Typography>
            <Typography variant="Tag/sm">
              <p>
                {omnibusRate.price} {omnibusRate.unit}
              </p>
            </Typography>
          </footer>
        ) : null}
      </div>
      {isSelected && (
        <MaterialIcon
          icon="check"
          size={22}
          color="Icon/Inverted"
          className={styles.checkIcon}
        />
      )}
    </div>
  )
}
