import { getShopcartlist, deleteshopcartlist, changeshopcartchecked } from "@/api/detail"
// 封装游客临时身份模块 uuid--->生成一个而随机字符串 (不能再变了)
import { getUUID } from "@/utils/uuid_token"
const state = {
	shopcartlist: [],
	// 游客临时身份
	uuid_token: getUUID()
}
const mutations = {
	GETSHOPCARTLIST(state, shopcartlist) {
		state.shopcartlist = shopcartlist
	}
}
const actions = {
	// 根据uuid获取购物车列表数据
	async getShopcartlist1({ commit }) {
		// 即使不传参都好,别忘了后面加()
		let result = await getShopcartlist()
		if (result.code == 200) {
			// console.log(result);
			commit("GETSHOPCARTLIST", result.data)
		}
	},
	// 根据传递的商品id删除购物车中对应的商品
	async deleteshopcart({ commit }, skuId) {
		let result = await deleteshopcartlist(skuId)
		// async返回的都是Promise 有成功和失败回调
		console.log(result);
		if (result.code == 200) {
			// 成功的回调(前台try进行接收,resolve)
			return "删除成功"
		} else {
			// 失败的时候返回的值(前台通过catch的error,message进行接收,reject)
			return Promise.reject(new Error("faile"))
		}
	},
	// 根据商品id切换商品的选中状态
	async changeshopcartcheck({ commit }, { skuID, isChecked }) {
		let result = await changeshopcartchecked(skuID, isChecked)
		// 自定义成功和失败的回调函数
		if (result.code == 200) {
			return "修改商品状态成功"
		} else {
			return Promise.reject(new Error("修改商品状态失败"))
		}
	},
	// 删除全部勾选的产品
	deleteAllshopcart({ dispatch, getters }) {
		// const {dispatch, getters}=context context是actions业务逻辑所有方法集合 
		// context（小仓库）:commit(mutations修改state) getters计算属性 dispatch派发action
		// 自己文件就不需要用this啦!!!!!!!!!!!

		let PromiseAll = [] //所有返回的promise结果都存储在这里
		// 用forEach循环每一项
		getters.cartlist.cartInfoList.forEach((item) => {
			// result返回的是一个Promise对象
			let result = item.isChecked == 1 ? dispatch("deleteshopcart", item.skuId) : 0
			PromiseAll.push(result)
		})
		// 只要全部p1,p2..异步结果成功,返回的结果即为成功
		// 一个为失败就失败
		return Promise.all(PromiseAll)
	},
	// 点击全选勾上所有,不勾就全不勾
	isAllcheckchange({ dispatch, getters }, isChecked) {
		let promiseAll = []
		getters.cartlist.cartInfoList.forEach((item) => {
			let result = dispatch("changeshopcartcheck", { skuID: item.skuId, isChecked: isChecked })
			// console.log(result);  //一旦发现返回了多个promise，就是用promise.all等所有执行完返回一个结果
			promiseAll.push(result)
		})
		return Promise.all(promiseAll) //所有结果成功就返回成功,一个失败就会失败
	}
}
// 计算属性 简化接口的数据
const getters = {
	// 以后都简化最外层
	cartlist(state) {
		return state.shopcartlist[0] || {}
	},
	// 之所以不用这个 是因为组件接收是对象
	// cartInfoList(state){
	// 	return state.shopcartlist[0].cartInfoList ||[]
	// }
}

export default {
	state,
	mutations,
	actions,
	getters
}