"use client"

import { useEffect } from "react"
import { useIntl } from "react-intl"

import { dt } from "@/lib/dt"

import {
  CheckCircleIcon,
  DirectionsIcon,
  EmailIcon,
  LinkIcon,
} from "@/components/Icons"
import CrossCircleIcon from "@/components/Icons/CrossCircle"
import IconChip from "@/components/TempDesignSystem/IconChip"
import Body from "@/components/TempDesignSystem/Text/Body"
import Caption from "@/components/TempDesignSystem/Text/Caption"
import Subtitle from "@/components/TempDesignSystem/Text/Subtitle"
import { Toast } from "@/components/TempDesignSystem/Toasts"
import useLang from "@/hooks/useLang"
import { formatPrice } from "@/utils/numberFormatting"

import { useMyStayTotalPriceStore } from "../stores/myStayTotalPrice"
import SummaryCard from "./SummaryCard"

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

import type { Hotel } from "@/types/hotel"
import type { BookingConfirmation } from "@/types/trpc/routers/booking/confirmation"

interface BookingSummaryProps {
  booking: BookingConfirmation["booking"]
  hotel: Hotel
}

export default function BookingSummary({
  booking,
  hotel,
}: BookingSummaryProps) {
  const intl = useIntl()
  const lang = useLang()
  const { totalPrice, currencyCode, addRoomPrice } = useMyStayTotalPriceStore()

  useEffect(() => {
    addRoomPrice({
      id: booking.confirmationNumber ?? "",
      totalPrice: booking.totalPrice,
      currencyCode: booking.currencyCode,
      isMainBooking: true,
    })
  }, [booking, addRoomPrice])

  const directionsUrl = `https://www.google.com/maps/dir/?api=1&destination=${hotel.location.latitude},${hotel.location.longitude}`
  const isPaid =
    booking.rateDefinition.cancellationRule !== "CancellableBefore6PM"
  const bookingDate = dt(booking.createDateTime)
    .locale(lang)
    .format("D MMMM YYYY")

  return (
    <div className={styles.bookingSummary}>
      <Subtitle textTransform="uppercase" color="burgundy">
        {intl.formatMessage({ id: "Booking summary" })}
      </Subtitle>
      <div className={styles.bookingSummaryContent}>
        <SummaryCard
          title={formatPrice(intl, totalPrice, currencyCode)}
          image={{
            src: "/_static/img/scandic-coin.svg",
            alt: "Scandic coin",
          }}
          texts={[`${intl.formatMessage({ id: "Payment" })}: N/A`]}
          supportingText={bookingDate}
          chip={
            <IconChip
              color={isPaid ? "green" : "red"}
              icon={
                isPaid ? (
                  <CheckCircleIcon width={20} height={20} color="green" />
                ) : (
                  <CrossCircleIcon width={20} height={20} color="red" />
                )
              }
            >
              <Caption color={isPaid ? "green" : "red"}>
                <strong>{intl.formatMessage({ id: "Status" })}:</strong>{" "}
                {isPaid
                  ? intl.formatMessage({ id: "Paid" })
                  : intl.formatMessage({ id: "Unpaid" })}
              </Caption>
            </IconChip>
          }
        />
        <SummaryCard
          title={hotel.name}
          image={{
            src: "/_static/img/scandic-service.svg",
            alt: "Scandic service",
          }}
          texts={[
            hotel.address.streetAddress,
            `${hotel.address.zipCode} ${hotel.address.city}`,
          ]}
          supportingText={intl.formatMessage(
            { id: "Long {long} ∙ Lat {lat}" },
            {
              lat: hotel.location.latitude,
              long: hotel.location.longitude,
            }
          )}
          links={[
            {
              href: directionsUrl,
              text: intl.formatMessage({ id: "Directions" }),
              icon: <DirectionsIcon width={20} height={20} color="burgundy" />,
            },
            {
              href: `mailto:${hotel.contactInformation.email}`,
              text: intl.formatMessage({ id: "Email" }),
              icon: <EmailIcon width={20} height={20} color="burgundy" />,
            },
            {
              href: hotel.contactInformation.websiteUrl,
              text: intl.formatMessage({ id: "Homepage" }),
              icon: <LinkIcon width={20} height={20} color="burgundy" />,
            },
          ]}
        />
      </div>
      {hotel.specialAlerts.length > 0 && (
        <div className={styles.toast}>
          <Toast variant="info">
            <ul className={styles.list}>
              {hotel.specialAlerts.map((alert) => (
                <li key={alert.id}>
                  <Body color="uiTextHighContrast">{alert.text}</Body>
                </li>
              ))}
            </ul>
          </Toast>
        </div>
      )}
    </div>
  )
}
