// redux-store/slices/discount.ts import { CategoryRuleType, CreateDiscountPayload, ProductRuleType } from '@/types/services/discount' import { createSlice, PayloadAction } from '@reduxjs/toolkit' // Temporary interfaces for rules before discount is created interface TempProductRule { product_id: string product_name?: string rule_type: ProductRuleType quantity: number free_quantity: number } interface TempCategoryRule { category_id: string category_name?: string rule_type: CategoryRuleType } interface DiscountState { discountRequest: CreateDiscountPayload selectedOutlets: string[] productRules: TempProductRule[] categoryRules: TempCategoryRule[] } const initialState: DiscountState = { discountRequest: { campaign_id: '', code: '', name: '', type: 'percentage', value: 0, min_purchase_amount: 0, min_purchase_qty: 0, start_date: '', end_date: '', usage_limit_per_customer: undefined, usage_limit_total: undefined, customer_type: 'all', is_stackable: false, priority: 10 }, selectedOutlets: [], productRules: [], categoryRules: [] } const discountSlice = createSlice({ name: 'discount', initialState, reducers: { // Set entire discount object setDiscount: (state, action: PayloadAction) => { state.discountRequest = action.payload }, // Set individual field setDiscountField: (state, action: PayloadAction<{ field: keyof CreateDiscountPayload; value: any }>) => { const { field, value } = action.payload state.discountRequest[field] = value as never }, // Reset discount to initial state resetDiscount: state => { state.discountRequest = initialState.discountRequest state.selectedOutlets = [] state.productRules = [] state.categoryRules = [] }, // Outlet management setDiscountOutlets: (state, action: PayloadAction) => { state.selectedOutlets = action.payload }, addDiscountOutlet: (state, action: PayloadAction) => { if (!state.selectedOutlets.includes(action.payload)) { state.selectedOutlets.push(action.payload) } }, removeDiscountOutlet: (state, action: PayloadAction) => { state.selectedOutlets = state.selectedOutlets.filter(id => id !== action.payload) }, // Product rules management setProductRules: (state, action: PayloadAction) => { state.productRules = action.payload }, addProductRule: (state, action: PayloadAction) => { state.productRules.push(action.payload) }, updateProductRule: (state, action: PayloadAction<{ index: number; rule: TempProductRule }>) => { const { index, rule } = action.payload if (index >= 0 && index < state.productRules.length) { state.productRules[index] = rule } }, removeProductRule: (state, action: PayloadAction) => { state.productRules = state.productRules.filter((_, index) => index !== action.payload) }, clearProductRules: state => { state.productRules = [] }, // Category rules management setCategoryRules: (state, action: PayloadAction) => { state.categoryRules = action.payload }, addCategoryRule: (state, action: PayloadAction) => { state.categoryRules.push(action.payload) }, updateCategoryRule: (state, action: PayloadAction<{ index: number; rule: TempCategoryRule }>) => { const { index, rule } = action.payload if (index >= 0 && index < state.categoryRules.length) { state.categoryRules[index] = rule } }, removeCategoryRule: (state, action: PayloadAction) => { state.categoryRules = state.categoryRules.filter((_, index) => index !== action.payload) }, clearCategoryRules: state => { state.categoryRules = [] }, // Bulk operations clearAllRules: state => { state.productRules = [] state.categoryRules = [] }, // Set multiple fields at once setDiscountFields: (state, action: PayloadAction>) => { state.discountRequest = { ...state.discountRequest, ...action.payload } } } }) export const { setDiscount, setDiscountField, resetDiscount, setDiscountOutlets, addDiscountOutlet, removeDiscountOutlet, setProductRules, addProductRule, updateProductRule, removeProductRule, clearProductRules, setCategoryRules, addCategoryRule, updateCategoryRule, removeCategoryRule, clearCategoryRules, clearAllRules, setDiscountFields } = discountSlice.actions export default discountSlice.reducer // Selectors (optional but recommended) export const selectDiscountRequest = (state: { discountReducer: DiscountState }) => state.discountReducer.discountRequest export const selectSelectedOutlets = (state: { discountReducer: DiscountState }) => state.discountReducer.selectedOutlets export const selectProductRules = (state: { discountReducer: DiscountState }) => state.discountReducer.productRules export const selectCategoryRules = (state: { discountReducer: DiscountState }) => state.discountReducer.categoryRules export const selectIsDiscountValid = (state: { discountReducer: DiscountState }) => { const { discountRequest } = state.discountReducer return ( discountRequest.campaign_id !== '' && discountRequest.code !== '' && discountRequest.name !== '' && discountRequest.start_date !== '' && discountRequest.end_date !== '' && (discountRequest.type === 'free_product' || discountRequest.value > 0) ) }