import Vue from "vue"

const state = {
    cartList: [],
    activityCartList: {}
};

const getters = {
    // 检查商品是否存在于购物车中
    checkProductExists(state) {
        return function (skuId) {
            const pos = state.cartList.findIndex(item => item.skuId === skuId)
            return pos === -1 ? false : true;
        }
    },
    // 获取单个商品的购买数量
    getProductSkuNum(state) {
        return function (skuId) {
            const index = state.cartList.findIndex(item => item.skuId === skuId);
            return index !== -1 ? state.cartList[index].skuNum : 0;
        }
    },
    // 获取购物车商品信息列表
    getCartInfoList(state) {
        return state.activityCartList.carInfoVoList
    },
    // 是否显示包含多个商品的内容
    showMultiCheckbox(state) {
        return function (index) {
            return state.activityCartList.carInfoVoList[index].cartInfoList.length > 1
        }
    },
    // 确认多个商品项是否为选中
    getMultiCheckCart(state) {
        return function (index) {
            return state.activityCartList.carInfoVoList[index].cartInfoList.every(item => item.isChecked === 1);
        }
    },
    // 获取多个商品项的ids
    getMultiCheckedIds(state) {
        return function (index) {
            let ids = []
            state.activityCartList.carInfoVoList[index].cartInfoList.forEach(item => ids.push(item.skuId));
            return ids.toString();
        }
    },
    // 判断是否全选
    isAllSelected(state) {
        let isAllSelected = true;
        state.activityCartList.carInfoVoList && state.activityCartList.carInfoVoList
            .forEach(carInfoItem => {
                carInfoItem.cartInfoList.forEach(cartInfoItem => {
                    if (cartInfoItem.isChecked === 0) {
                        isAllSelected = false;
                        return false;
                    }
                })
            })
        return isAllSelected;
    },
    // 获取购物车价格信息
    getCartPriceInfo(state) {
        if (!state.activityCartList.totalAmount) {
            return {
                couponReduceAmount: 0,
                originalTotalAmount: 0,
                totalAmount: 0
            }
        }

        return {
            couponReduceAmount: state.activityCartList.couponReduceAmount,
            originalTotalAmount: state.activityCartList.originalTotalAmount,
            totalAmount: state.activityCartList.totalAmount
        }
    },
    // 确认选中购物车的数量
    getSelectedCount(state) {
        let count = 0;
        state.activityCartList.carInfoVoList && state.activityCartList.carInfoVoList
            .forEach(carInfoItem => {
                carInfoItem.cartInfoList.forEach(cartInfoItem => {
                    if (cartInfoItem.isChecked === 1) {
                        count += cartInfoItem.skuNum;
                    }
                })
            })
        return count;
    },
    // 获取购物车优惠券信息列表
    getCartCouponInfoList(state) {
        return state.activityCartList.couponInfoList
    },
}

const mutations = {
    // 添加到购物车
    addShopMutation(state, payload) {
        state.cartList.push(payload);
    },
    // 获取不带活动的购物车列表
    getCartListMutation(state, payload) {
        state.cartList = payload;
    },
    // 修改购物车数量
    changeSkuNumMutation(state, payload) {
        // skuId为商品id
        // value为+1或者-1，操作的递增值
        // currentBuyNum为number-box组件当前商品购物车的操作值
        const {
            skuId,
            value,
            currentBuyNum
        } = payload
        const index = state.cartList.findIndex(item => item.skuId === skuId);
        // 如果当前购买数量小于1则删除该商品
        if (currentBuyNum < 1) {
            state.cartList.splice(index, 1)
        } else {
            state.cartList[index].skuNum += value
        }
    },
    // 删除购物车
    deleteShopMutation(state, payload) {
        // 删除cartList中的数据
        const cartListIndex = state.cartList.findIndex(item => item.skuId === payload);
        state.cartList.splice(cartListIndex, 1)
    },
    // 获取带活动的购物车列表
    getActivityCartListMutation(state, payload) {
        state.activityCartList = payload
    },

}
const actions = {
    // 添加到购物车
    async addShopAction({
                            commit,
                            state
                        }, payload) {
        // 给对象添加响应式数据属性
        Vue.set(payload, 'skuNum', 1)
        Vue.set(payload, 'skuId', payload.id)
        Vue.set(payload, 'isChecked', 1)
        await this._vm.$u.api.getAddToCart({
            skuId: payload.id,
            skuNum: payload.skuNum,
        })
        commit('addShopMutation', payload)
    },
    // 获取不带活动的购物车列表
    async getCartListAction({
                                commit
                            }) {
        let result = await this._vm.$u.api.getCartList()
        commit('getCartListMutation', result)
    },
    // 修改购物车数量
    async changeSkuNumAction({
                                 commit,
                                 dispatch
                             }, payload) {
        const {
            skuId,
            value,
            currentBuyNum,
            isCart
        } = payload;
        // 如果当前购买的数量小于1，则需要将该商品从购物车中删除，否则进行购物车数量的修改
        if (currentBuyNum < 1) {
            dispatch('deleteShopAction', payload)
        } else {
            await this._vm.$u.api.getAddToCart({
                skuId: skuId,
                skuNum: value,
            })
            commit('changeSkuNumMutation', payload)
        }

        // 通过isCart判断是否是在购物车里进行购物车数量的改变，
        // 如果是在购物车里进行数量变化，则还需要获取带活动的购物车列表
        if (isCart) dispatch('getActivityCartListAction')

    },
    // 删除购物车
    async deleteShopAction({
                               commit,
                               dispatch
                           }, payload) {
        const {
            skuId,
            value,
            currentBuyNum,
            isCart
        } = payload;
        await this._vm.$u.api.deleteCart(skuId);

        // 删除时如果是在购物车列表操作，则需要重新获取数据
        if (isCart) await dispatch('getActivityCartListAction')
        await commit('deleteShopMutation', skuId)
    },
    // 获取带活动的购物车列表
    async getActivityCartListAction({
                                        commit
                                    }, payload) {
        let showLoading = false;
        if (payload) showLoading = true

        let result = await this._vm.$u.api.getActivityCartList({
            showLoading
        })
        commit('getActivityCartListMutation', result)
    },
    // 切换购物车商品的选中状态
    async changeCheckCartAction({
                                    commit,
                                    dispatch
                                }, payload) {
        let result = await this._vm.$u.api.getCheckCart(payload)
        dispatch('getActivityCartListAction')
    },
    // 对指定的多个商品进行选择/反选
    async changeMultiCheckedCartAction({
                                           commit,
                                           dispatch
                                       }, payload) {
        let result = await this._vm.$u.api.postBatchCheckCart(payload)
        dispatch('getActivityCartListAction')
    },
    // 对所有购物车商品进行全选/反选
    async changeAllCheckCartAction({
                                       commit,
                                       dispatch
                                   }, payload) {
        let result = await this._vm.$u.api.getCheckAllCart(payload)
        dispatch('getActivityCartListAction')
    },
};

export default {
    namespaced: true,
    state,
    mutations,
    actions,
    getters,
};
