import { create } from "zustand" import { calculateRoomSummary } from "./helper" import type { RoomPackageCodeEnum, RoomPackages, } from "@/types/components/hotelReservation/selectRate/roomFilter" import type { Rate, RateCode, } from "@/types/components/hotelReservation/selectRate/selectRate" import type { RoomConfiguration } from "@/types/trpc/routers/hotel/roomAvailability" export interface RateSummaryParams { getFilteredRooms: (roomIndex: number) => RoomConfiguration[] availablePackages: RoomPackages 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 getSelectedRateSummary: () => Rate[] } 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 }) }, getSelectedRateSummary: () => { const { rateSummary } = get() return rateSummary.filter((summary): summary is Rate => summary !== null) }, }))