import { create } from "zustand" import { calculateRoomSummary } from "./helper" import type { RoomPackageCodeEnum, RoomPackageData, } from "@/types/components/hotelReservation/selectRate/roomFilter" import type { Rate, RateCode, } from "@/types/components/hotelReservation/selectRate/selectRate" import type { RoomConfiguration } from "@/server/routers/hotels/output" export interface RateSummaryParams { getFilteredRooms: (roomIndex: number) => RoomConfiguration[] availablePackages: RoomPackageData roomCategories: Array<{ name: string; roomTypes: Array<{ code: string }> }> selectedPackagesByRoom: Record } interface RateSelectionState { selectedRates: (RateCode | undefined)[] rateSummary: (Rate | null)[] modifyRate: (index: number) => void selectRate: (index: number, rate: RateCode | undefined) => void initializeRates: (count: number) => void calculateRateSummary: ({ getFilteredRooms, availablePackages, roomCategories, }: RateSummaryParams) => void } export const useRateSelectionStore = create((set, get) => ({ selectedRates: [], rateSummary: [], modifyRate: (index) => set((state) => { const newRates = [...state.selectedRates] newRates[index] = undefined return { selectedRates: newRates } }), selectRate: (index, rate) => set((state) => { const newRates = [...state.selectedRates] newRates[index] = rate return { selectedRates: newRates } }), initializeRates: (count) => set({ selectedRates: new Array(count).fill(undefined) }), calculateRateSummary: (params) => { const { selectedRates } = get() const summaries = selectedRates.map((selectedRate, roomIndex) => { if (!selectedRate) return null return calculateRoomSummary({ selectedRate, roomIndex, ...params, }) }) set({ rateSummary: summaries }) }, }))