import { deepClone, clearTypeListZeros, clearGoodTypeListZero, mergeGoodToShopcar, clearShoplistConfirmed } from '@/common/util/index.js'

export default {
	namespaced: true,
	state: {
		list: []
	},
	getters: {
		shopcarNum: state => { // 计算购车商品数量
			return state.list.reduce((t, e) => {
				return e.typeList.reduce((tt, ee) => {
					return Object.keys(ee.size).reduce((ttt, eee) => {
						return ttt + ee.size[eee]
					}, tt)
				}, t)
			}, 0)
		},
		choosedNum: state => { // 计算购车已选商品数量
			return state.list.reduce((t, e) => {
				return e.typeList.reduce((tt, ee) => {
					return Object.keys(ee.size).reduce((ttt, eee) => {
						return ttt + (ee.choosed[eee] ? ee.size[eee] : 0)
					}, tt)
				}, t)
			}, 0)
		},
		choosedPrice: state => { // 计算购车已选商品价值
			return state.list.reduce((t, e) => {
				return e.typeList.reduce((tt, ee) => {
					return Object.keys(ee.size).reduce((ttt, eee) => {
						return ttt + (ee.choosed[eee] ? ee.size[eee] : 0) * e.price
					}, tt)
				}, t)
			}, 0)
		},
		choosedList: state => { // 获取购物车已选中的商品列表
			const list = deepClone(state.list)
			for(let i = list.length - 1; i >= 0; i --) {
				if (!list[i].choosed) {
					list.splice(i, 1)
				} else {
					list[i].typeList.forEach(ee => {
						Object.keys(ee.choosed).forEach(eee => {
							if (!ee.choosed[eee]) {
								delete ee.size[eee]
								delete ee.choosed[eee]
							}
						})
					})
				}
			}
			return list
		},
		choosedAll: state => { // 计算购车是否为全选状态
			return state.list.every(e => {
				return e.typeList.every(ee => {
					return Object.keys(ee.choosed).every(eee => {
						return ee.choosed[eee]
					})
				})
			})
		}
	},
	mutations: {
		ADD(state, payload) { // 添加商品到购物车 (已存在合并,不存在添加)
			const index = state.list.findIndex(e => e.id === payload.id) // 检查添加商品是否存在于购物车中
			setTimeout(() => {
				if(state.list.length === 0 || index === -1) {
					state.list.push(payload)
				} else {
					mergeGoodToShopcar(state.list[index], payload)
				}
			}, 567)
		},
		DEL(state, index) { // 删除这件商品
			state.list.splice(index, 1)
		},
		CLEARCONFIRM(state, payload) { // 提交订单后删除购物车已经提交的商品
			clearShoplistConfirmed(state.list, payload)
		},
		COUNTCHANGE(state, payload) { // 修改购物商品数量相关操作
			const index = payload[0], typeIndex = payload[1], key = payload[2], value = payload[3]
			state.list[index].typeList[typeIndex].size[key] = value
			if (value === 0) { // 当某个尺码数量变为 0 时,进行一波操作,删除这件商品的这个类型或者商品
				clearTypeListZeros(state.list[index].typeList) // 清除这件商品 typeList 中 对象的 size 对象的 key 数量为 0 的对象  
				clearGoodTypeListZero(state.list) // 清除购物车中 typeList 长度为 0 的商品
			}
		},
		CHOOSEDCHANGE(state, payload) { // 修改选择状态相关操作
			const index = payload[0], typeIndex = payload[1], key = payload[2]
			if (payload.length === 3) { // 点击 选择/取消 商品类型, 选择/取消 该商品商品类型,同时和 选择/取消 商品联动
				state.list[index].typeList[typeIndex].choosed[key] = !state.list[index].typeList[typeIndex].choosed[key]
				state.list[index].choosed = state.list[index].typeList.some(e => Object.keys(e.choosed).some(ee => e.choosed[ee] === true))
			} else if (payload.length === 1) { // 点击 选择/取消 商品, 选择/取消 该商品所有的类型
				state.list[index].choosed = !state.list[index].choosed
				state.list[index].typeList.forEach(e => Object.keys(e.choosed).forEach(ee => e.choosed[ee] = state.list[index].choosed))
			} else { // 点击 取消/全选
				const status = this.getters['shopcar/choosedAll']
				state.list.forEach(e => {
					e.choosed = !status
					e.typeList.forEach(ee => {
						Object.keys(ee.choosed).forEach(eee => {
							ee.choosed[eee] = !status
						})
					})
				})
			}
		}
	}
}
