// import { sliceNames } from "@/src/constants/redux/redux";
// import { createSlice, PayloadAction } from "@reduxjs/toolkit";

// interface CartState {
//     cart: any;
//     addingProductId: string | null;
//     productId: string | null;
//     removeProductId: string | null;
//     isGuestUser: boolean;
// }

// const initialState: CartState = {
//     cart: null,
//     addingProductId: null,
//     productId: null,
//     removeProductId: null,
//     isGuestUser: false,
// };

// const cartSlice = createSlice({
//     name: sliceNames.cart,
//     initialState,
//     reducers: {
//         setCart: (
//             state,
//             action: PayloadAction<any>
//         ) => {
//             state.cart = action.payload;
//         },
//         setAddingProductLoading: (
//             state,
//             action: PayloadAction<string | null>
//         ) => {
//             state.addingProductId = action.payload;
//         },
//         setProductLoading: (
//             state,
//             action: PayloadAction<string | null>
//         ) => {
//             state.productId = action.payload;
//         },

//         setRemoveProductLoading: (
//             state,
//             action: PayloadAction<string | null>
//         ) => {
//             state.removeProductId = action.payload;
//         },
//         setGuestUser: (
//             state,
//             action: PayloadAction<boolean>
//         ) => {
//             state.isGuestUser = action.payload;
//         },

//         clearGuestUser: (state) => {
//             state.isGuestUser = false;
//         },
//         clearCartLoading: (state) => {
//             state.productId = null;
//             state.removeProductId = null;
//         },
//     },
// });

// export const {
//     setAddingProductLoading,
//     setProductLoading,
//     setRemoveProductLoading,
//     clearCartLoading,
//     setCart,
//     clearGuestUser,
//     setGuestUser
// } = cartSlice.actions;

// export default cartSlice.reducer;


import { isArray, isEmpty, size, isObject, get, find } from "lodash";
import { createSlice, PayloadAction } from "@reduxjs/toolkit";


import { couponTypes, paymentMethods } from "@/constants/cart";
import { calculateTotalDiscountAmountDifference } from "@/utils/helpers";
import { sliceNames } from "@/src/constants/redux/redux";

export interface CartItem {
    _id?: string;
    slug?: string;
    variantId?: string;
    cartId?: string;
    [key: string]: any;
    products: any;
}

interface CartSummary {
    [key: string]: string[] | number | undefined;
    totalCouponAmount?: number;
    totalInterNationalShippingAmount?: number;
}

interface CartDetails {
    cartCount: number;
    cartSummary: CartSummary | null;
    cartProducts: CartItem[];
    cartIsLoading: boolean;
    couponCode: null | string;
    couponCodeData: null | any;
    deliveryCharge: null | number;
    cartEnabled: boolean;
    isCouponApplied: any;
    paymentMethod: any | null;
    addingProductId: string | null;
    productId: string | null;
    removeProductId: string | null;
}

const initialState: CartDetails = {
    cartCount: 0,
    cartSummary: null,
    isCouponApplied: null,
    cartProducts: [],
    cartIsLoading: false,
    couponCode: null,
    couponCodeData: null,
    deliveryCharge: null,
    cartEnabled: false,
    paymentMethod: null,
    addingProductId: null,
    productId: null,
    removeProductId: null,
};

const cartSlice = createSlice({
    name: sliceNames.cart,
    initialState,
    reducers: {
        setCart: (state, action: PayloadAction<any>) => {
            if (!action.payload) {
                state.cartProducts = [];
                state.cartSummary = null;
                state.cartCount = 0;
                return;
            }

            const { products, ...summary } = action.payload;

            state.cartProducts = products || [];
            state.cartSummary = summary;
            state.cartCount = (products || []).reduce(
                (total: number, item: any) => total + item.quantity,
                0
            );
        },
        setCart1: (state, action: PayloadAction<CartItem | any>) => {
            if (action.payload) {
                const { products, checkoutWithCoupon = false, ...restCartData } = action.payload;
                const cartSummary = JSON.parse(JSON.stringify(state.cartSummary));
                if (!isEmpty(restCartData) && isArray(products) && size(products) > 0) {
                    state.cartSummary = {
                        ...restCartData as CartSummary, totalInterNationalShippingAmount: 0, ...((checkoutWithCoupon && cartSummary.totalCouponAmount > 0) ? {
                            totalCouponAmount: cartSummary.totalCouponAmount,
                            totalAmount: restCartData.totalAmount - cartSummary.totalCouponAmount
                        } : {})
                    };
                    state.cartProducts = products;
                    state.cartCount = products.reduce((acc, product) => acc + product.quantity, 0);
                    if (!checkoutWithCoupon) {
                        state.couponCodeData = null;
                        state.couponCode = null;
                    }
                } else {
                    state.cartSummary = null;
                    state.cartProducts = [];
                    state.cartCount = 0;
                    state.couponCodeData = null;
                    state.couponCode = null;
                }
            } else {
                state.cartSummary = null;
                state.cartProducts = [];
                state.cartCount = 0;
                state.couponCodeData = null;
                state.couponCode = null;
            }
        },
        setUpdateTotalInterNationalShippingAmount: (state, action: PayloadAction<{ internationalShippingCharge: number; shipmentSettings: any }>) => {
            if (state.cartSummary) {
                const { internationalShippingCharge, shipmentSettings } = action.payload;
                const internationalFreeShippingThreshold = Number(shipmentSettings?.internationalFreeShippingThreshold) || 0;
                const cartTotal = Number(state.cartSummary.totalProductAmount) || 0;

                const finalInternationalCharge = internationalFreeShippingThreshold > 0 && cartTotal >= internationalFreeShippingThreshold ? 0 : internationalShippingCharge;

                const previousAmount = Number(state.cartSummary.totalInterNationalShippingAmount) || 0;
                state.cartSummary.totalInterNationalShippingAmount = finalInternationalCharge;
                state.cartSummary.totalAmount = Number(state.cartSummary.totalAmount) - previousAmount + finalInternationalCharge;
            }
        },
        setCouponCode: (state: any, action: PayloadAction<any>) => {
            const cartSummary = JSON.parse(JSON.stringify(state.cartSummary));
            if (cartSummary) {
                if (cartSummary?.totalCouponAmount > 0) {
                    state.cartSummary.totalAmount = Number(state.cartSummary.totalCouponAmount) + Number(state.cartSummary.totalAmount)
                    state.cartSummary.totalCouponAmount = 0;
                } else {
                    state.cartSummary.totalCouponAmount = 0;
                }
            }
            if (!isEmpty(action.payload)) {
                const { couponType, couponApplyValues, discountAmount: discount, discountType, discountMaxRedeemAmount, minPurchaseValue, shipmentSettings } = action.payload;
                const cartProducts = JSON.parse(JSON.stringify(state.cartProducts));
                let isCouponApplied = false;
                const discountAmount = discount;
                const newCartSummary = JSON.parse(JSON.stringify(state.cartSummary));
                if (newCartSummary && isArray(cartProducts) && size(cartProducts) > 0) {
                    let couponWithTotalAmount = 0

                    const updateTotalCouponAmount = (totalAmount: number) => {
                        if (state.cartSummary) {
                            const couponDiscountAmount = calculateTotalDiscountAmountDifference(totalAmount, discountType, discountAmount);
                            const totalCouponAmount = ((discountType === 'percentage') && Number(discountMaxRedeemAmount) > 0) ? Math.min(couponDiscountAmount, Number(discountMaxRedeemAmount)) : couponDiscountAmount;
                            let cartTotalAmount = newCartSummary?.totalAmount - totalCouponAmount;
                            let isSpendThreshold = true;
                            const loyaltyDetails = get(newCartSummary, 'loyalty');
                            const spendThreshold = Number(get(loyaltyDetails, 'spendThreshold', 0));
                            if (!isEmpty(loyaltyDetails) && spendThreshold > 0) {
                                const subAmount = Number(cartTotalAmount || 0) - Number(newCartSummary.totalShippingAmount || 0) - Number(newCartSummary.paymentMethodCharge || 0);
                                if (subAmount < spendThreshold) {
                                    isSpendThreshold = false;
                                }
                            }
                            if (isSpendThreshold) {
                                if ((totalAmount > totalCouponAmount) && ((minPurchaseValue ? totalAmount >= minPurchaseValue : true))) {
                                    let totalShippingAmount = (state as any).cartSummary.totalShippingAmount;
                                    if (totalShippingAmount === 0) {
                                        const shippingCharge = Number(get(shipmentSettings, 'shippingCharge', 0)) > 0 ? Number(get(shipmentSettings, 'shippingCharge', 0)) : 0;
                                        totalShippingAmount = shippingCharge > 0 ? (((cartTotalAmount >= Number(shipmentSettings.freeShippingThreshold)) && (cartTotalAmount) - (Number(shipmentSettings.freeShippingThreshold)) > 0) ? 0 : shippingCharge) : 0;
                                        if (totalShippingAmount > 0) {
                                            cartTotalAmount += totalShippingAmount
                                        }
                                    }

                                    state.cartSummary.totalCouponAmount = totalCouponAmount;
                                    state.cartSummary.totalAmount = cartTotalAmount;
                                    state.cartSummary.totalShippingAmount = totalShippingAmount;
                                    isCouponApplied = true;
                                }
                            }
                        }
                    };

                    if (couponTypes.entireOrders !== couponType) {
                        let isCouponApplicable = false;
                        if (couponTypes.forCategory === couponType) {
                            cartProducts.forEach((product: any) => {
                                if (isObject(product.productDetails)) {
                                    const { productCategory } = product.productDetails;
                                    if (isArray(productCategory)) {
                                        productCategory.forEach((categoryObj: any) => {
                                            if (isObject(categoryObj.category) && couponApplyValues.includes(categoryObj.category._id)) {
                                                const { productAmount } = product;
                                                couponWithTotalAmount += productAmount
                                                isCouponApplicable = true;
                                            }
                                        });
                                    }
                                }
                            });
                            updateTotalCouponAmount(couponWithTotalAmount);

                            if (!isCouponApplicable) {
                                state.couponCodeData = null;
                                return;
                            }
                        } else if (couponTypes.forBrand === couponType) {
                            let isCouponApplicable = false;
                            cartProducts.forEach((product: any) => {
                                if (isObject(product.productDetails)) {
                                    const { brand } = product.productDetails;
                                    if (brand && couponApplyValues.includes(brand)) {
                                        const { productAmount } = product;
                                        isCouponApplicable = true;
                                        couponWithTotalAmount += productAmount
                                    }
                                }
                            });
                            updateTotalCouponAmount(couponWithTotalAmount);

                            if (!isCouponApplicable) {
                                state.couponCodeData = null;
                                return;
                            }
                        } else if (couponTypes.forProduct === couponType) {
                            let isCouponApplicable = false;
                            cartProducts.forEach((product: any) => {
                                const { productId, productAmount } = product;

                                if (productId && couponApplyValues.includes(productId)) {
                                    couponWithTotalAmount += productAmount
                                    isCouponApplicable = true;
                                }
                            });
                            updateTotalCouponAmount(couponWithTotalAmount);
                            if (!isCouponApplicable) {
                                state.couponCodeData = null;
                                return;
                            }
                        }
                    } else {

                        updateTotalCouponAmount(newCartSummary?.totalProductAmount)
                    }
                }
                if (isCouponApplied) {
                    state.isCouponApplied = {
                        messages: 'Coupon applied successfully',
                        type: 'success',
                        from: 'cart',
                    }
                } else {
                    state.isCouponApplied = {
                        messages: "This coupon code cannot be redeemed on the selected item.",
                        type: 'error',
                        from: 'cart',
                    }
                    return;
                }
            }

            state.couponCode = action.payload?.couponCode || null;
            state.couponCodeData = action.payload || null;
        },
        setCartIsLoading: (state, action: PayloadAction<boolean>) => {
            state.cartIsLoading = action.payload;
        },
        setCartEnabled: (state, action: PayloadAction<boolean>) => {
            state.cartEnabled = action.payload;
        },
        setDeliveryCharge1: (state, action: PayloadAction<any>) => {
            const { paymentMethod, defualtSettings } = action.payload || {};

            const oldDeliveryCharge = Number(state.deliveryCharge || 0);

            if (!state.cartSummary) return;

            // Remove previously applied charge
            if (oldDeliveryCharge > 0) {
                state.cartSummary.totalAmount =
                    Number(state.cartSummary.totalAmount) - oldDeliveryCharge;
            }

            // COD
            if (paymentMethod?.slug === paymentMethods.cashOnDelivery) {
                const codCharge = Number(
                    paymentMethod?.paymentMethodCharge || defualtSettings?.codCharge || 0
                );

                state.deliveryCharge = codCharge;

                state.cartSummary.totalAmount =
                    Number(state.cartSummary.totalAmount) + codCharge;

                return;
            }

            // Other payment methods
            state.deliveryCharge = 0;
        },
        setDeliveryCharge: (state, action: PayloadAction<any>) => {
            const { paymentMethod, defualtSettings } = action.payload || {};
            const cartSummary = state.cartSummary
                ? JSON.parse(JSON.stringify(state.cartSummary))
                : null;

            const deliveryCharge = state.deliveryCharge
                ? JSON.parse(JSON.stringify(state.deliveryCharge))
                : 0;

            if (action.payload && state.cartSummary) {

                const { paymentMethod, defualtSettings } = action.payload;

                if (paymentMethod?.slug === paymentMethods.cashOnDelivery) {

                    if (Number(deliveryCharge) > 0) {
                        state.deliveryCharge = 0;

                        state.cartSummary.totalAmount =
                            Number(cartSummary.totalAmount) - Number(deliveryCharge);
                    }


                    const cartSummaryNew = JSON.parse(
                        JSON.stringify(state.cartSummary)
                    );


                    if (
                        Number(state.deliveryCharge) === 0 &&
                        Number(defualtSettings?.codCharge) > 0
                    ) {

                        state.cartSummary.totalAmount =
                            Number(cartSummaryNew.totalAmount) +
                            Number(defualtSettings.codCharge);

                        state.deliveryCharge =
                            Number(defualtSettings.codCharge);

                    } else {

                        state.deliveryCharge =
                            Number(defualtSettings?.codCharge || 0);

                    }


                } else {


                    if (Number(deliveryCharge) > 0) {

                        state.deliveryCharge = 0;

                        state.cartSummary.totalAmount =
                            Number(cartSummary.totalAmount) -
                            Number(defualtSettings?.codCharge || 0);
                    }


                    state.deliveryCharge = 0;
                }


            } else {

                if (cartSummary && state.cartSummary) {
                    state.cartSummary.totalAmount =
                        Number(cartSummary.totalAmount) -
                        Number(deliveryCharge);
                }

            }
        },
        setDeliveryCharge3: (state, action: PayloadAction<any>) => {
            if (!action.payload || !state.cartSummary) {
                return;
            }

            // console.log("========== DELIVERY CHARGE ==========");
            // console.log("FULL PAYLOAD:", action.payload);
            // console.log("paymentMethod:", action.payload?.paymentMethod);
            // console.log("defualtSettings:", action.payload?.defualtSettings);
            // console.log("codCharge:", action.payload?.codCharge);
            // console.log("=====================================");

            const { paymentMethod, defualtSettings } = action.payload;

            const previousDeliveryCharge = Number(
                state.deliveryCharge || 0
            );


            const baseTotal =
                Number(state.cartSummary.totalAmount || 0) -
                previousDeliveryCharge;

            const codCharge = Number(
                defualtSettings?.codCharge ||
                action.payload?.codCharge ||
                paymentMethod?.paymentMethodCharge
                ||
                0
            );

            if (paymentMethod?.slug === paymentMethods.cashOnDelivery) {
                state.deliveryCharge = codCharge;

                state.cartSummary.totalAmount =
                    baseTotal + codCharge;
            } else {
                state.deliveryCharge = 0;

                state.cartSummary.totalAmount =
                    baseTotal;
            }

        },
        setAreaShippingCharge: (state: any, action: PayloadAction<any>) => {
            const { shipmentSettings, cityId, stateId, pickupStoreId } = action.payload;
            if (!isEmpty(shipmentSettings)) {
                if (pickupStoreId && (cityId === '' && stateId === '')) {
                    state.cartSummary.totalAmount = Number(state.cartSummary.totalAmount) - Number(state.cartSummary.totalShippingAmount);
                    state.cartSummary.totalShippingAmount = 0;
                    state.cartSummary.isAreaWiseShippingCharged = false;
                    state.stateId = '';
                    state.cityId = '';
                } else {
                    const areaWiseDeliveryChargeValues = shipmentSettings.areaWiseDeliveryChargeValues || []
                    if (!isEmpty(areaWiseDeliveryChargeValues) && size(areaWiseDeliveryChargeValues) > 0) {
                        const matchedValue = find(areaWiseDeliveryChargeValues, (item: any) => {
                            if (item.stateId === stateId) {
                                if (cityId) {
                                    return item.cityId === cityId;
                                }
                                return true;
                            }
                            return false;
                        });
                        if (matchedValue) {
                            const shippingCharge = matchedValue?.shippingCharge || 0;
                            const finalShippingCharge = Number(shippingCharge) > 0 ? (Number(matchedValue.freeShippingThreshold) > 0 && (Number(state.cartSummary.totalProductAmount) - Number(matchedValue.freeShippingThreshold)) > 0 ? 0 : shippingCharge) : 0;
                            state.cartSummary.totalAmount = ((Number(state.cartSummary.totalAmount) - Number(state.cartSummary.totalShippingAmount)) + Number(finalShippingCharge))
                            state.cartSummary.totalShippingAmount = finalShippingCharge
                            state.cartSummary.isAreaWiseShippingCharged = true;
                            state.stateId = stateId;
                            state.cityId = cityId;
                        } else {
                            const shippingCharge = shipmentSettings?.shippingCharge || 0;
                            const finalShippingCharge = Number(shippingCharge) > 0 ? (Number(shipmentSettings.freeShippingThreshold) > 0 && (Number(state.cartSummary.totalProductAmount) - Number(shipmentSettings.freeShippingThreshold)) > 0 ? 0 : shippingCharge) : 0;
                            state.cartSummary.totalAmount = ((Number(state.cartSummary.totalAmount) - Number(state.cartSummary.totalShippingAmount)) + Number(finalShippingCharge))
                            state.cartSummary.totalShippingAmount = finalShippingCharge;
                            state.stateId = '';
                            state.cityId = '';
                            state.cartSummary.isAreaWiseShippingCharged = false;
                        }
                    } else {
                        state.cartSummary.isAreaWiseShippingCharged = false;
                    }
                }
            }
        },
        setSelectedPaymentMethod: (state, action) => {
            state.paymentMethod = action.payload;
        },
        setPaymentMethod: (state) => {
            state.paymentMethod = null;
        },
        resetCart: (state) => {
            state.cartProducts = [];
            state.cartSummary = null;
            state.deliveryCharge = null;
            state.cartCount = 0;

        },
        clearCart: () => initialState,

        clearDeliveryCharge: (state) => {
            const deliveryCharge = Number(state.deliveryCharge || 0);

            if (state.cartSummary && deliveryCharge > 0) {
                state.cartSummary.totalAmount =
                    Number(state.cartSummary.totalAmount) - deliveryCharge;
            }

            state.deliveryCharge = 0;
        },
        setAddingProductLoading: (
            state,
            action: PayloadAction<string | null>
        ) => {
            state.addingProductId = action.payload;
        },
        setProductLoading: (
            state,
            action: PayloadAction<string | null>
        ) => {
            state.productId = action.payload;
        },

        setRemoveProductLoading: (
            state,
            action: PayloadAction<string | null>
        ) => {
            state.removeProductId = action.payload;
        },
    },
});

export const { setCart, setCartIsLoading, clearCart, setCouponCode, setUpdateTotalInterNationalShippingAmount, setAddingProductLoading, setProductLoading, setRemoveProductLoading, setDeliveryCharge, setAreaShippingCharge, setCartEnabled, resetCart, setSelectedPaymentMethod, setPaymentMethod, clearDeliveryCharge } = cartSlice.actions;
export default cartSlice.reducer;
