"use client"
import { useEffect, useRef } from "react"

import { createDetailsStore } from "@/stores/enter-details"
import {
  checkIsSameRoom,
  clearSessionStorage,
  readFromSessionStorage,
} from "@/stores/enter-details/helpers"

import { DetailsContext } from "@/contexts/Details"

import type { DetailsStore } from "@/types/contexts/enter-details"
import type { DetailsProviderProps } from "@/types/providers/enter-details"
import type { InitialState } from "@/types/stores/enter-details"

export default function EnterDetailsProvider({
  booking,
  showBreakfastStep,
  children,
  roomsData,
  searchParamsStr,
  user,
  vat,
}: DetailsProviderProps) {
  const storeRef = useRef<DetailsStore>()
  if (!storeRef.current) {
    const initialData: InitialState = {
      booking,
      rooms: roomsData
        .filter((r) => r.bedTypes?.length) // TODO: how to handle room without bedtypes?
        .map((room) => ({
          roomFeatures: room.packages,
          roomRate: room.roomRate,
          roomType: room.roomType,
          cancellationText: room.cancellationText,
          rateDetails: room.rateDetails,
          bedType:
            room.bedTypes?.length === 1
              ? {
                  roomTypeCode: room.bedTypes[0].value,
                  description: room.bedTypes[0].description,
                }
              : undefined,
        })),
      vat,
    }

    if (!showBreakfastStep) {
      initialData.breakfast = false
    }

    storeRef.current = createDetailsStore(initialData, searchParamsStr, user)
  }

  useEffect(() => {
    const storedValues = readFromSessionStorage()
    if (!storedValues) {
      return
    }
    const isSameRoom = checkIsSameRoom(storedValues.booking, booking)
    if (!isSameRoom) {
      clearSessionStorage()
      return
    }

    const state = storeRef.current?.getState()
    storeRef.current?.setState({
      ...state,
      rooms: storedValues.rooms,
      bookingProgress: storedValues.bookingProgress,
    })
  }, [booking])

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