import { create } from "zustand" import { calculateRoomSummary } from "./helper" import type { RoomPackageCodeEnum, RoomPackages, } from "@/types/components/hotelReservation/selectRate/roomFilter" import type { Child, 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)[] isPriceDetailsModalOpen: boolean isSummaryOpen: boolean guestsInRooms: { adults: number; children?: Child[] }[] modifyRateIndex: number | null modifyRate: (index: number) => void closeModifyRate: () => void selectRate: (index: number, rate: RateCode | undefined) => void initializeRates: (count: number) => void calculateRateSummary: ({ getFilteredRooms, availablePackages, roomCategories, }: RateSummaryParams) => void getSelectedRateSummary: () => Rate[] togglePriceDetailsModalOpen: () => void toggleSummaryOpen: () => void setGuestsInRooms: (index: number, adults: number, children?: Child[]) => void } export const useRateSelectionStore = create((set, get) => ({ selectedRates: [], rateSummary: [], isPriceDetailsModalOpen: false, isSummaryOpen: false, guestsInRooms: [{ adults: 1 }], modifyRateIndex: null, modifyRate: (index) => set({ modifyRateIndex: index }), closeModifyRate: () => set({ modifyRateIndex: null }), 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) }, togglePriceDetailsModalOpen: () => { set((state) => ({ isPriceDetailsModalOpen: !state.isPriceDetailsModalOpen, })) }, toggleSummaryOpen: () => { set((state) => ({ isSummaryOpen: !state.isSummaryOpen, })) }, setGuestsInRooms: (index, adults, children) => { set((state) => ({ guestsInRooms: [ ...state.guestsInRooms.slice(0, index), { adults, children }, ...state.guestsInRooms.slice(index + 1), ], })) }, }))