<template>
	<view >
		<view class="container">
			<!-- 空白页 -->
			<view v-if="!hasLogin || empty === true" class="empty">
				<image src="/static/error/emptyCart.png" class="emptyImg" mode="aspectFit"></image>
				<view v-if="hasLogin" class="empty-tips">
					空空如也
					<navigator class="navigator" v-if="hasLogin" url="../index/index" open-type="switchTab">随便逛逛></navigator>
				</view>
				<view v-else class="empty-tips">
					空空如也
					<view class="navigator" @click="navToLogin">去登陆></view>
				</view>
			</view>
			
			<scroll-view v-else>
				<!-- 列表 -->
				<view class="header flex1">
					<view class="header-1">共{{number}}件宝贝</view>
					<!-- <view class="header-2">管理</view> -->
				</view>
				<view class="cart-list">
					<view class="cart">
						<view class="cart-header">
							<view class="header-select" @click="check('all')">
								<view class="iconfont iconroundcheckfill checked-img" :class="{ 'checked': allChecked }"></view>
								<view class="word-1">全选</view>
							</view>
							<view class="clear-btn" @click="allChecked ? clearCart() : ''" :class="{ show: allChecked }"><text>清空</text></view>
						</view>
						<scroll-view v-for="(item, index) in cartList" :key="item.id">
							<uni-swipe-action>
								<uni-swipe-action-item class="cart-frame" :options="options" @click="swipeClick($event,index)">
									<view class="cart-item">
										<view class="iconfont iconroundcheckfill choose" :class="{ checked: item.checked }" @click="check('item', index)"></view>
										<view class="image-wrapper">
											<image
												:src="item.productInfo.image"
												:class="[item.loaded]"
												mode="aspectFill"
												lazy-load
												@load="onImageLoad('cartList', index)"
												@error="onImageError('cartList', index)"
											></image>
										</view>
										<view class="item-right">
											<text class="title">{{ item.productInfo.store_name }}</text>
											<view class="attr">
												<text class="attr-text">{{ item.productInfo.attrInfo.suk }}</text>
											</view>
											<view class="row">
												<view >
													<text class="price-1">¥</text>
													<text class="price-2">{{ item.productInfo.price }}</text>
												</view>
												<uni-number-box
													class="step"
													:min="1"
													:max="item.productInfo.stock"
													:value="item.cart_num > item.productInfo.stock ? item.productInfo.stock : item.cart_num"
													:isMax="item.cart_num >= item.productInfo.stock ? true : false"
													:isMin="item.cart_num === 1"
													:index="index"
													@eventChange="numberChange"
												></uni-number-box>
											</view>
										</view>
									</view>
								</uni-swipe-action-item>
							</uni-swipe-action>
						</scroll-view>
					</view>
				</view>
			</scroll-view>
			<!-- 底部菜单栏 -->
			<view class="action-section" v-if=" empty !== true">
				<view class="checkbox" @click="check('all')">
					<!-- <view class="checked-img" >
						<image class="img" src="https://mmz.liuniu946.com/statics/img/img09.png" v-if=""></image>
						<image class="img" src="../../static/img/img34.png"></image>
					</view> -->
					<view class="iconfont iconroundcheckfill checked-img" :class="{ 'checked': allChecked }"></view>
					<view class="checked-word" >全选</view>
				</view>
				<view class="total-box">
					<view >
						<text class="word">合计：</text>
						<text class="price">¥ {{ total }}</text>
					</view>
					<button type="primary" class="confirm-btn" @click="createOrder">
						<text >结算</text>
					</button>
				</view>
			</view>
		</view>
	</view>
</template>

<script>
import { getCartList, getCartNum, cartDel } from '@/api/cart.js';
import { mapState } from 'vuex';
import uniNumberBox from '@/components/uni-number-box.vue';
import uniSwipeAction from '@/components/uni-swipe-action/uni-swipe-action.vue'
import uniSwipeActionItem from '@/components/uni-swipe-action-item/uni-swipe-action-item.vue'
export default {
	components: {
		uniNumberBox,
		uniSwipeAction,
		uniSwipeActionItem
	},
	data() {
		return {
			number:0,//商品数量
			total: 0, //总价格
			allChecked: false, //全选状态  true|false
			empty: false, //空白页现实  true|false
			cartList: [],
			options:[
				// {
				// 	text: '取消',
				// 	style: {
				// 		backgroundColor: '#ff8000'
				// 	}
				// },
				{
					text: '删除',
					style: {
						backgroundColor: '#FC4141'
					}
				}
			]
		};
	},
	onShow() {
		// 只有登录时才加载数据
		if (this.hasLogin) {
			this.loadData();
		}
		console.log(this.empty,102)
	},
	watch: {
		//显示空白页
		cartList(e) {
			let empty = e.length === 0 ? true : false;
			if (this.empty !== empty) {
				this.empty = empty;
			}
		}
	},
	computed: {
		...mapState(['hasLogin'])
	},
	methods: {
		//请求数据
		async loadData() {
			let obj = this;
			getCartList({})
				.then(function(e) {
					console.log(e,'101');
					// 获取当前购物车物品增加数量
					let nub = obj.cartList.length;
					let aArray = obj.cartList.reverse();
					let bArray = e.data.valid.reverse();
					obj.cartList = bArray
						.map((item, ind) => {
							// 设置返回数据默认为勾选状态
							item.checked = false;
							// 获取相同数组之前对象的数据
							let carlist = obj.cartList[ind];
							// 判断之前是否已经加载完毕
							if (carlist && carlist.loaded == 'loaded') {
								item.loaded = 'loaded';
							}
							return item;
						})
						.reverse();
					obj.calcTotal(); //计算总价
					obj.number = obj.cartList.length;
				})
				.catch(function(e) {
					console.log(e);
				});
		},
		//监听image加载完成
		onImageLoad(key, index) {
			// 修改载入完成后图片class样式
			this.$set(this[key][index], 'loaded', 'loaded');
		},
		//监听image加载失败
		onImageError(key, index) {
			this[key][index].image = '/static/error/errorImage.jpg';
		},
		// 跳转到登录页
		navToLogin() {
			let url = '/pages/public/login';
			// #ifdef H5
			let weichatBrowser = uni.getStorageSync('weichatBrowser');
			// 判断是否为微信浏览器
			if (weichatBrowser) {
				url = '/pages/public/wxLogin';
			}
			// #endif
			// #ifdef MP-WEIXIN
			url = '/pages/public/wxLogin';
			// #endif
			uni.navigateTo({
				url: url
			});
		},
		//选中状态处理
		check(type, index) {
			if (type === 'item') {
				this.cartList[index].checked = !this.cartList[index].checked;
			} else {
				const checked = !this.allChecked;
				const list = this.cartList;
				list.forEach(item => {
					item.checked = checked;
				});
				this.allChecked = checked;
			}
			this.calcTotal(type);
		},
		//数量
		numberChange(data) {
			let arr = this.cartList[data.index];
			arr.cart_num = data.number;
			getCartNum({ id: arr.id, number: data.number });
			this.calcTotal();
		},
		// 滑动删除
		swipeClick(e, index) {
			let {
				content
			} = e
			if (content.text === '删除') {
				uni.showModal({
					title: '删除',
					content: '是否删除',
					success: (res) => {
						if (res.confirm) {
							this.deleteCartItem(index)
						} else if (res.cancel) {
						}
						
					}
				});
			}
		},
		//删除
		deleteCartItem(index) {
			let list = this.cartList;
			let row = list[index];
			let id = row.id;
			cartDel({
				ids: id
			});
			this.cartList.splice(index, 1);
			uni.hideLoading();
			this.calcTotal();
		},
		//清空
		clearCart() {
			uni.showModal({
				content: '清空购物车？',
				success: e => {
					if (e.confirm) {
						let st = this.cartList.map(e => {
							return e.id;
						});
						cartDel({
							ids: st.join(',')
						}).then(e => {
							console.log(e);
						});
						this.cartList = [];
					}
				}
			});
		},
		//计算总价
		calcTotal() {
			let list = this.cartList;
			if (list.length === 0) {
				this.empty = true;
				return;
			}
			let total = 0;
			let checked = true;
			list.forEach(item => {
				if (item.checked === true) {
					total += item.productInfo.price * item.cart_num;
				} else if (checked === true) {
					checked = false;
				}
			});
			this.allChecked = checked;
			this.total = Number(total.toFixed(2));
		},
		//创建订单
		createOrder() {
			let list = this.cartList;
			let goodsData = [];
			list.forEach(item => {
				if (item.checked) {
					goodsData.push(item.id);
				}
			});
			if ( this.total == 0 ) {
				uni.showToast({
				    title: '请先选择需购买的商品',
				    icon: 'none'
				});
			} else {
				uni.navigateTo({
					url: '/pages/order/createOrder?id=' + goodsData.join(',')
				});
			}
		}
	}
};
</script>

<style lang="scss">
page {
	min-height: 100%;
}


.container {
	padding-bottom: 134rpx;
	background-color: $page-color-base;
	height: 100%;
	position: relative;
	/* 空白页 */
	.empty {
		position: fixed;
		left: 0;
		top: 0;
		width: 100%;
		height: 100vh;
		padding-bottom: 100rpx;
		display: flex;
		justify-content: center;
		flex-direction: column;
		align-items: center;
		background: #fff;
		.emptyImg {
			width: 300rpx;
			height: 250rpx;
			margin-bottom: 30rpx;
		}
		.empty-tips {
			display: flex;
			font-size: $font-sm + 2rpx;
			color: $font-color-disabled;
			.navigator {
				color: $uni-color-primary;
				margin-left: 16rpx;
			}
		}
	}
	.header{
		padding: 30rpx 25rpx;
		background:#FFFFFF;
		.header-1{
			font-size:24rpx;
			font-weight:400;
			color:#666666;
		}
		.header-2{
			font-size:28rpx;
			font-weight:400;
			color:#333333;
		}
	}
	/* 列表 */
	.cart-list{
		width: 100%;
		padding: 24rpx;
		.cart{
			width: 100%;
			background-color: #FFFFFF;
			padding: 20rpx 20rpx 30rpx 30rpx;
			border-radius: 10rpx;
			.cart-header{
				margin-bottom: 18rpx;
				display: flex;
				align-items: center;
				justify-content: space-between;
				.header-select {
					display: flex;
					align-items: center;
					.checked-img{
						font-size: 28rpx;
						margin-right: 10rpx;
						color: $font-color-disabled;
					}
					.checked-img.checked {
						color: $background-color;
					}
					.word-1{
						font-size:30rpx;
						font-weight:400;
						color:#1d2023;
					}
				}
				.clear-btn {
					height: 52rpx;
					line-height: 52rpx;
					// padding-left: 38rpx;
					font-size: $font-base;
					border-radius: 0 50px 50px 0;
					opacity: 0;
					transition: 0.2s;
					&.show {
						opacity: 1;
					}
				}
			}
			/* 购物车列表项 */
			.cart-item {
				display: flex;
				position: relative;
				// height: 200rpx;
				display: flex;
				align-items:center;
				padding: 10rpx 0;
				.choose{
					font-size: 28rpx;
					color: $font-color-disabled;
					margin-right: 20rpx;
				}
				.choose.checked {
					color: $background-color;
				}
				.image-wrapper {
					width: 20%;
					width: 160rpx;
					height: 160rpx;
				}
				.item-right {
					overflow: hidden;
					width: 440rpx;
					// height: 160rpx;
					display: flex;
					flex-direction: column;
					padding-left: 30rpx;
					.title{
						font-size:26rpx;
						font-weight:500;
						color:#333333;
						font-weight:550;
						overflow : hidden;
						text-overflow: ellipsis;
						display: -webkit-box;
						-webkit-line-clamp: 2;
						-webkit-box-orient: vertical;
					}
					.attr {
						margin-top: 20rpx;
						.attr-text {
							display: inline-block;
							padding: 0 20rpx;
							background:#f6f6f6;
							border-radius:10rpx;
							font-size:18rpx;
							font-weight:400;
							color:#606972;
							line-height: 50rpx;
							text-align: center;
						}
					}
					.row{
						display: flex;
						align-items:center;
						justify-content: space-between;
						margin-top: 5px;
						.price-1 {
							font-size:24rpx;
							font-weight:bold;
							color:#fa2740;
						}
						
						.price-2 {
							font-size:30rpx;
							font-weight:bold;
							color:#fa2740;
						}
						// .step {
						// 	width: 170rpx;
						// 	height: 45rpx;
						// }
					}
				}
			}
		}
	}
	/* 底部栏 */
	.action-section {
		width: 100%;
		background:#ffffff;
		box-shadow:0px -3px 7px 0px #e6e6e6;
		padding:20rpx 35rpx;
		display: flex;
		justify-content:space-between;
		position: fixed;
		bottom: 0rpx;
		/* #ifdef APP-PLUS */
		
		/* #endif */
		.checkbox {
			display: flex;
			justify-content:space-between;
			align-items: center;
			.checked-img{
				font-size: 28rpx;
				margin-right: 10rpx;
				color: $font-color-disabled;
			}
			.checked-img.checked {
				color: $background-color;
			}
			.checked-word{
				font-size:30rpx;
				font-weight:400;
				color:#1d2023;
			}
		}
		.total-box {
			display: flex;
			justify-content:space-between;
			.word {
				font-size:26rpx;
				font-weight:500;
				color:#333333;
				margin-right: 16rpx;
			}
			.price {
				font-size:26rpx;
				font-weight:550;
				color:#FA2740;
				margin-right: 34rpx;
				
			}
			.confirm-btn{
				width:160rpx;
				height:64rpx;
				background:$base-color;
				border-radius:32rpx;
				display: flex;
				justify-content:center;
				align-items: center;
			}
		}
	}
}

</style>
