"use client"

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

import { createBookingConfirmationStore } from "@/stores/booking-confirmation"

import { BookingConfirmationContext } from "@/contexts/BookingConfirmation"
import { formatPrice } from "@/utils/numberFormatting"

import type { BookingConfirmationStore } from "@/types/contexts/booking-confirmation"
import { CurrencyEnum } from "@/types/enums/currency"
import type { BookingConfirmationProviderProps } from "@/types/providers/booking-confirmation"

export default function BookingConfirmationProvider({
  bookingCode,
  children,
  currencyCode,
  fromDate,
  toDate,
  roomCategories,
  rooms,
  vat,
}: BookingConfirmationProviderProps) {
  const intl = useIntl()
  const storeRef = useRef<BookingConfirmationStore>(undefined)

  if (!storeRef.current) {
    const totalBookingPrice = rooms.reduce((acc, room) => {
      const reservationTotalPrice = room?.totalPrice || 0
      return acc + reservationTotalPrice
    }, 0)
    let formattedTotalCost = formatPrice(intl, totalBookingPrice, currencyCode)
    const totalBookingPoints = rooms.reduce((acc, room) => {
      return acc + (room?.roomPoints ?? 0)
    }, 0)
    const totalBookingCheques = rooms.reduce((acc, room) => {
      return acc + (room?.cheques ?? 0)
    }, 0)
    const totalBookingVouchers = rooms.reduce((acc, room) => {
      return acc + (room?.vouchers ?? 0)
    }, 0)

    let isVatCurrency = true
    if (totalBookingPoints) {
      isVatCurrency = false
      formattedTotalCost = formatPrice(
        intl,
        totalBookingPoints,
        CurrencyEnum.POINTS,
        totalBookingPrice,
        currencyCode
      )
    } else if (totalBookingCheques) {
      isVatCurrency = false
      formattedTotalCost = formatPrice(
        intl,
        totalBookingCheques,
        CurrencyEnum.CC,
        totalBookingPrice,
        currencyCode
      )
    } else if (totalBookingVouchers) {
      const room = rooms?.[0]
      if (room?.packages) {
        const pkgsSum = room.packages.reduce(
          (total, pkg) => total + pkg.totalPrice,
          0
        )
        const currency = room.packages.find((pkg) => pkg.currency)?.currency
        isVatCurrency = false
        formattedTotalCost = formatPrice(
          intl,
          totalBookingVouchers,
          CurrencyEnum.Voucher,
          pkgsSum,
          currency
        )
      } else {
        isVatCurrency = false
        formattedTotalCost = formatPrice(
          intl,
          totalBookingVouchers,
          CurrencyEnum.Voucher
        )
      }
    }
    const initialData = {
      bookingCode,
      currencyCode,
      fromDate,
      toDate,
      roomCategories,
      rooms,
      vat,
      isVatCurrency,
      formattedTotalCost,
      totalBookingPrice,
      totalBookingCheques,
    }

    storeRef.current = createBookingConfirmationStore(initialData)
  }

  return (
    <BookingConfirmationContext.Provider value={storeRef.current}>
      {children}
    </BookingConfirmationContext.Provider>
  )
}
