<template>
	<view class="ns-time">
		<uni-popup type="bottom" ref="selectTime">
			<view class="box">
				<view class="title">
					<block v-if="obj.delivery && obj.delivery.delivery_type == 'local'">选择送达时间</block>
					<block v-if="obj.delivery && obj.delivery.delivery_type == 'store'">选择自提时间</block>
					<text class="iconfont icon-close" @click="close"></text>
				</view>
				<view class="body">
					<!-- 左侧日期选择 -->
					<scroll-view :scroll-y="true" class="left">
						<view class="item" :class="index == keyJudge ? 'itemDay' : ''" v-for="(item, index) in dayData" :key="index" @click="selectTime('days', index, 'yes')">
							<block v-if="item.title">{{ item.title }}</block>
							<block v-else>{{ item.month }}</block>
							<text class="itemtext">{{ item.Day }}</text>
						</view>
					</scroll-view>
					<!-- 右侧时间选择 -->
					<scroll-view :scroll-y="true" class="right">
						<view class="item" :class="key == keyJudge && index == keys ? 'itemTime' : ''" v-for="(item, index) in timeData" :key="index" @click="selectTime('time', index, 'yes')">
							{{ item }}
							<text v-if="key == keyJudge && index == keys" class="iconfont icon-yuan_checked color-base-text"></text>
						</view>
					</scroll-view>
				</view>
			</view>
		</uni-popup>
	</view>
</template>

<script>
export default {
	name: "nsSelectTime",
	data() {
		return {
			//选中日期的键值
			key: 0,
			//选中时间的键值
			keys: 0,
			//渲染用数据
			obj: {},
			//左侧渲染时间
			dayData: [],
			// 右侧渲染数据
			timeData: [],
			//判断弹窗打开
			judge: false,
			//判断左侧列表是否为日期选中列表
			keyJudge: 0,
			//当前时间时间戳
			dayTime: 0
		};
	},
	methods: {
		refresh(){
			this.key = 0;
			this.keys = 0;
			this.keyJudge = 0;
		},
		/**
		 * 弹窗打开
		 */
		open(obj, type) {
			this.dayData = [];
			this.timeData = [];
			this.obj = obj;
			this.toDay(obj.dataTime.time_type, obj.dataTime.time_week);
			if (this.judge) {
				if (type == 'no') {
					this.selectTime('', '', type);
				} else {
					this.$refs.selectTime.open();
				}
			}
		},
		/**
		 * 时间选择
		 */
		selectTime(type, index, judge) {
			if (type == 'days') {
				this.keyJudge = index;
				this.toTime();
			} else if (type == 'time') {
				this.keys = index;
				this.key = this.keyJudge;
				let obj = this.dayData[this.key];
				obj.time = this.timeData[this.keys];
				let time = obj.time.replace('立即配送（','').replace('）','');

				var dateTime = new Date();
				var format = time.split('-');
				var startHours = format[0].split(':');
				var endHours = format[1].split(':');

				let timeData = obj.month.split('月');
				let month = timeData[0];
				let date = timeData[1].split('日')[0];

				// 开始时间戳
				dateTime.setHours(startHours[0],startHours[1],0,0);
				obj.start_time = dateTime.getTime()/1000;
				obj.start_date = dateTime.getFullYear() + '-' + month + '-' + date + ' ' + format[0];

				// 结束时间戳
				dateTime.setHours(endHours[0],endHours[1],0,0);
				obj.end_time = dateTime.getTime()/1000;
				obj.end_date = dateTime.getFullYear() + '-' + month + '-' + date + ' ' + format[1];

				this.$emit('selectTime', { data: obj, type: judge });
				this.$refs.selectTime.close();
			}

			if (judge == 'no') {
				this.toTime(judge);
				let obj = this.dayData[0];
				obj.time = this.timeData[0];
				this.$emit('selectTime', { data: obj, type: judge });
			}
			this.$forceUpdate();
		},
		/**
		 * 弹窗关闭
		 */
		close() {
			this.$refs.selectTime.close();
		},
		/**
		 * 左侧数据处理
		 */
		toDay(type, obj) {
			let today = new Date();
			if (this.obj.dataTime.advance_day) {
				today = new Date(today.getTime() + (this.obj.dataTime.advance_day * 86400000));
			}
			let nowYear = today.getFullYear(); //当前年
			let nowMonth = today.getMonth() + 1; //当前月
			let nowDate = today.getDate(); //当前日
			let nowDay = today.getDay(); //当前星期几
			let endDay = new Date(nowYear, nowMonth, 0).getDate(); //当月多少天
			let Hours = today.getHours();
			let Minutes = today.getMinutes();
			this.dayTime = this.obj.dataTime.advance_day ? 0 : Number(Hours) * 3600 + Number(Minutes) * 60; //获取到当前时分秒的时间戳
			let judge = false;
			let num = 1; //记录循环执行过的次数
			let mostDay = this.obj.dataTime.most_day ? this.obj.dataTime.most_day + 1 : 1;  // 最多可预约天数
			let startTime = parseInt(today.getTime() / 1000);
			let week = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];
			if (obj.time_week && obj.time_week.length == 7) {
				//判断是否七天全有
				judge = true;
			}

			for (let i = 0; i < mostDay; i++) {
				let objects = {};
				let dayStr = week[ nowDay ];
				// 判断最大可预约时间
				if (this.obj.dataTime.most_day > 0 && ((startTime + num * 86400) > (startTime + this.obj.dataTime.most_day * 86400) ) ) {
					this.judge = true;
					break;
				}
				//判断当天是否能够配送、自提
				if (type == 0 || judge || obj.indexOf(nowDay.toString()) != -1) {
					let endTime = this.obj.dataTime.delivery_time[ (this.obj.dataTime.delivery_time.length - 1) ].end_time;
						endTime -= this.obj.dataTime.time_interval * 60;
					switch (num) {
						case 1:
							if (i == 0) {
								if (endTime < this.dayTime) {
									i = i - 1;
								} else {
									objects = {
										title: this.obj.dataTime.advance_day == 0 ? '今天' : '',
										type: 'special',
										month: nowMonth + '月' + nowDate + '日',
										Day: '(' + dayStr + ')'
									};
									this.dayData.push(objects); //左侧日期数据处理
								}
							}
							break;
						case 2:
							if (i == 0 || i == 1) {
								objects = {
									title: this.obj.dataTime.advance_day == 0 ? '明天' : '',
									month: nowMonth + '月' + nowDate + '日',
									Day: '(' + dayStr + ')'
								};
								this.dayData.push(objects); //左侧日期数据处理
							}
							break;
						default:
							objects = {
								title: '',
								month: nowMonth + '月' + nowDate + '日',
								Day: '(' + dayStr + ')'
							};
							this.dayData.push(objects); //左侧日期数据处理
					}
				} else {
					i = i - 1;
				}

				if (nowDate != endDay) {
					nowDate += 1;
				} else {
					if (nowMonth != 12) {
						nowMonth += 1;
					} else {
						nowMonth = 1;
					}
					nowDate = 1;
				}

				if (nowDay != 6) {
					nowDay += 1;
				} else {
					nowDay = 0;
				}
				num += 1;
				
				if (this.obj.dataTime.most_day == 0 && i == 0) {
					this.judge = true;
				}
			}

			this.toTime(); //处理右侧时间数据
		},
		/**
		 * 处理右侧时间数据
		 */
		toTime(judge) {
			//并非打开弹窗进入时，所有数据置零
			if (judge == 'no') {
				this.key = 0;
				this.keys = 0;
				this.keyJudge = 0;
			}

			let timeData = [];
			
			if (!this.obj.dataTime.delivery_time) {
				this.obj.dataTime.delivery_time = [ {start_time: this.obj.dataTime.start_time, end_time: this.obj.dataTime.end_time} ]
			}
			
			//判断选中是否为当天
			let remainder = 0;
			//当天配送自提的话，向后推迟30分钟
			let newDayTime = JSON.parse(JSON.stringify(this.dayTime));
			// newDayTime = Math.ceil(this.dayTime / 600) * 600 + 1800;
			
			//判断选中是否为当天
			let timeJudage = false;
			if (this.dayData[this.keyJudge] && this.dayData[this.keyJudge].type && newDayTime > this.obj.dataTime.start_time) timeJudage = true;
			
			let timeInterval = this.obj.dataTime.time_interval ? this.obj.dataTime.time_interval * 60 : 1200;
			
			this.obj.dataTime.delivery_time.forEach(item => {
				item.end_time = item.end_time ? item.end_time : 86400; 
				let num = parseInt((parseInt(item.end_time) - parseInt(item.start_time)) / timeInterval);
				let time = timeJudage ? parseInt(newDayTime) : parseInt(item.start_time);
				for (let i = 0; i < num; i++) {
					if (parseInt(time) + parseInt(timeInterval) > item.end_time) break;
					if (timeJudage) {
						if (time >= newDayTime) {
							if (this.obj.dataTime.time_interval) {
								if (time <= item.end_time) {
									let text = '';
									if (this.obj.delivery.delivery_type == 'local' && i == 0) {
										text = '立即配送（'+ this.$util.getTimeStr(time) + '-' + this.$util.getTimeStr(time + timeInterval) + '）';
									} else {
										text = this.$util.getTimeStr(time) + '-' + this.$util.getTimeStr(time + timeInterval);
									}
									timeData.push(text);
								} 
							} else {
								timeData.push(this.$util.getTimeStr(time));
							}
						}
					} else {
						if (this.obj.dataTime.time_interval) {
							if (time <= item.end_time) timeData.push(this.$util.getTimeStr(time) + '-' + this.$util.getTimeStr(time + timeInterval));
						} else {
							timeData.push(this.$util.getTimeStr(time));
						}
					}
					time = parseInt(time) + timeInterval;
				}
			})
			this.timeData = timeData;
			this.$forceUpdate();
		}
	}
};
</script>

<style lang="scss" scoped>
.box {
	height: 728rpx;
	.title {
		padding: 0 30rpx;
		box-sizing: border-box;
		text-align: center;
		font-size: 28rpx;
		font-weight: bold;
		position: relative;
		height: 90rpx;
		line-height: 90rpx;
		border-bottom: 1rpx solid #f7f4f4;
		.icon-close {
			font-size: 26rpx;
			color: #909399;
			position: absolute;
			right: 30rpx;
			top: 50%;
			transform: translateY(-50%);
		}
	}
	.body {
		width: 100%;
		height: calc(100% - 90rpx);
		display: flex;
		align-items: center;
		.left {
			width: 230rpx;
			background: #f8f8f8;
			height: 100%;
			.item {
				width: 100%;
				padding: 16rpx 30rpx;
				box-sizing: border-box;
				text-align: center;
				font-size: 24rpx;
				display: flex;
				align-items: center;
			}
			.itemDay {
				background: #ffffff;
			}
		}
		.right {
			width: calc(100% - 230rpx);
			height: 100%;
			padding: 0 30rpx;
			box-sizing: border-box;
			.item {
				width: 100%;
				font-size: 24rpx;
				border-bottom: 1rpx solid #eeeeee;
				display: flex;
				align-items: center;
				justify-content: space-between;
				height: 72rpx;
				.icon-yuan_checked {
					font-size: 38rpx;
					margin-right: 30rpx;
				}
			}
			.itemTime {
				color: var(--main-color);
			}
		}
	}
}
</style>
