<template>
	<main-layout>
		<!-- 用户信息区 -->
		<view class="user-info">
			<span class="nickname" v-if="!userInfoStore.isLogin" @click="goUserInfoPage">登录</span>
			<view class="user-icon" v-if="userInfoStore.isLogin">
				<uni-icons type="person" size="30"></uni-icons>	
			</view>
			<span class="nickname" v-if="userInfoStore.isLogin" @click="goUserInfoPage">{{userInfoStore.nickname}}</span>
			<span class="user-btn" v-if="userInfoStore.isLogin" @click="goUserInfoPage">用户中心</span>
		</view>
		
		<!-- 结算 -->
		<view class="settle-container">
			<!-- 刮刮乐、奖励数相关区域 -->
			<view class="left-box">
				<view class="split-box">
					<view class="line-box">
						<span>投入</span>
						<span class="number-box" @click="addScratchRecord(SCRATCH_ACTION_TYPE_INVEST)">
							￥{{userInfo.lotteryInvestAmount}}
							<uni-icons type="compose" color="#FFFFFF"></uni-icons>
						</span>
					</view>
					<view class="under-line-box">
						<span>中奖</span>
						<span class="number-box"  @click="addScratchRecord(SCRATCH_ACTION_TYPE_WIN)">
							￥{{userInfo.lotteryWinAmount}}
							<uni-icons type="compose" color="#FFFFFF"></uni-icons>
						</span>
					</view>
				</view>
				<view class="split-box">
					<view class="line-box">
						<span>已领取</span>
						<span class="number-box">{{userInfo.claimedRewardNum}}</span>
					</view>
					<view  class="under-line-box">
						<span>总奖励</span>
						<span class="number-box">{{userInfo.totalRewardNum}}</span>
					</view>
				</view>	
			</view>
			<!-- 待领取奖励区 -->
			<view class="right-box">
				<view class="reward-title">待领取奖励数</view>
				<view class="reward-num">{{userInfo.unclaimedRewardNum}}</view>
				<view class="reward-btn-group">
					<view class="reward-btn-left" @click="claimReward('all')">全部领取</view>
					<view class="reward-btn-right" @click="claimReward('part')">部分领取</view>
				</view>
			</view>
			<!-- 刷新按钮 -->
			<view class="refresh-btn" @click="getUserInfo">
				<uni-icons type="refreshempty" color="#406CE7"></uni-icons>	
			</view>
		</view>
		
		<!-- 打卡任务 -->
		<view class="task-container">
			<view class="task-header">
				<view class="task-title" v-if="punchIns.length && punchIns.length > 0">任务（{{punchIns.length}}个）
				</view>
				<view class="task-title" v-else>任务</view>
				<view class="task-add-btn" @click="goPunchInEditPage">
					<uni-icons type="plusempty" size="30" color="#406CE7"></uni-icons>
				</view>
			</view>
			<view class="task-item" v-for="punchIn in punchIns" :key="punchIn.punchInId">
				<view class="main-box" @click="goPunchInDetailPage(punchIn.punchInId)">
					<view class="item-header">
						<span class="item-title">{{punchIn.taskName}}</span>
						<span class="item-reward">x{{punchIn.rewardNum}}</span>
						<view class="item-tag" v-if="punchIn.fullAttendanceFlag">全勤奖励</view>
						<view class="item-tag" v-if="punchIn.weekendDoubleFlag">周末双倍</view>
					</view>
					<view class="item-desc">
						规则：{{punchIn.description}}
					</view>
					<view class="item-detail-list">
						<view class="item-detail" v-for="punchInRecord in punchIn.punchInRecords"
							:key="punchInRecord.punchInDate">
							<view class="detail-text">
								<uni-dateformat :date="punchInRecord.punchInDate" format="M/d"></uni-dateformat>
							</view>
							<view class="detail-box" style="background-color: #E5E5E5;"
								v-if="punchInRecord.punchInStatus == 'uncreated'"></view>
							<view class="detail-box" style="background-color: #A5D63F;"
								v-if="punchInRecord.punchInStatus == 'punchIn'"></view>
							<view class="detail-box" style="background-color: #D43030;"
								v-if="punchInRecord.punchInStatus == 'unPunchIn'"></view>
							<view class="detail-box"
								v-if="punchInRecord.punchInStatus == 'futureTime' || punchInRecord.punchInStatus == 'todayUnknown'">
							</view>
						</view>
					</view>
				</view>
				<view :class="punchIn.punchInStatus == 'punchIn'?'func-box func-box-finish':'func-box func-box-unfinish'" v-if="punchIn.category == 0" @click="doPunchIn(punchIn.punchInId)">
					<span v-if="punchIn.punchInStatus == 'unPunchIn' || punchIn.punchInStatus == 'todayUnknown'">打卡</span>
					<span v-else>已完成</span>
				</view>
				<view :class="punchIn.punchInStatus == 'punchIn'?'func-box func-box-finish':'func-box func-box-unfinish'" v-if="punchIn.category == 1" @click="doPunchIn(punchIn.punchInId)">
					<span>{{punchIn.countTrack}}</span>
					<span>计数</span>
				</view>
				<view :class="punchIn.punchInStatus == 'punchIn'?'func-box func-box-finish':'func-box func-box-unfinish'" v-if="punchIn.category == 2" @click="doPunchInForTimeTrack(punchIn.punchInId, punchIn.timeTrack)">
					<span>
						{{punchIn.timeTrack.slice(0, 5)}}
					</span>
					<span>计时</span>
				</view>
			</view>
		</view>
		
		<!-- 刮刮乐弹出框 -->
		<uni-popup ref="scratchInputDialog" type="dialog" :is-mask-click="false">
			<uni-popup-dialog 
				mode="input" 
				:before-close="true" 
				:title="scratchFormData.actionType == SCRATCH_ACTION_TYPE_INVEST ? '投入金额' : '中奖金额'" 
				confirmText="保存" 
				@confirm="scratchFormConfirm"
				@close="scratchFormClose">
				<view style="width: 100%;">
					<uni-forms ref="scratchForm" :modelValue="scratchFormData" :rules="scratchFormRules" label-position="top" :label-width="150">
						<uni-forms-item label="刮刮乐来源" name="source" required>
							<uni-data-select :localdata="scratchSourceRange" v-model="scratchFormData.source"></uni-data-select>
						</uni-forms-item>
						<uni-forms-item label="刮刮乐种类" name="category" required>
							<uni-data-select :localdata="scratchCategoryRange" v-model="scratchFormData.category"></uni-data-select>
						</uni-forms-item>
						<uni-forms-item :label="scratchFormData.actionType == SCRATCH_ACTION_TYPE_INVEST ? '投入金额' : '中奖金额'" name="amount" required>
							<uni-easyinput type="digit" placeholder="请输入金额" v-model="scratchFormData.amount"></uni-easyinput>
						</uni-forms-item>
					</uni-forms>
				</view>
			</uni-popup-dialog>
		</uni-popup>
		
		<!-- 领取奖励弹出框 -->
		<uni-popup ref="claimRewardInputDialog" type="dialog" :is-mask-click="false">
			<uni-popup-dialog
				mode="input" 
				:before-close="true" 
				title="领取奖励" 
				confirmText="领取" 
				@confirm="claimRewardFormConfirm"
				@close="claimRewardFormClose">
				<view style="width: 100%;">
					<uni-forms ref="claimRewardForm" :modelValue="claimRewardFormData" :rules="claimRewardFormRules" label-position="top" :label-width="150">
						<uni-forms-item name="claimRewardNum">
							<uni-easyinput type="digit" placeholder="请输入领取的奖励数" v-model="claimRewardFormData.claimRewardNum"></uni-easyinput>
						</uni-forms-item>
					</uni-forms>
				</view>
			</uni-popup-dialog>
		</uni-popup>
			
		<!-- 计时弹出框 -->
		<uni-popup ref="timeTrackInputDialog" type="dialog" :is-mask-click="false">
			<uni-popup-dialog
				mode="input" 
				:before-close="true" 
				title="计时记录" 
				confirmText="保存" 
				@confirm="timeTrackFormConfirm"
				@close="timeTrackFormClose">
				<view style="width: 100%;">
					<uni-forms ref="timeTrackForm" :modelValue="timeTrackFormData" :rules="timeTrackFormRules" label-position="top" :label-width="150">
						<uni-forms-item name="timeTrack">
							<picker mode="time" :value="timeTrackFormData.timeTrack" @change="timeTrackChange">
								<view class="pick-box">{{timeTrackFormData.timeTrack}}</view>
							</picker>
						</uni-forms-item>
					</uni-forms>
				</view>
			</uni-popup-dialog>
		</uni-popup>
	</main-layout>
</template>

<script setup>
	import { onMounted, ref } from 'vue';
	import { onLoad, onPullDownRefresh, onShow } from "@dcloudio/uni-app";
	import { rewardApi, punchInApi, userApi, scratchApi } from '@/service/apis.js';
	import router from '@/common/constants/router.js';
	import { scratchSourceRange, scratchCategoryRange, SCRATCH_ACTION_TYPE_INVEST, SCRATCH_ACTION_TYPE_WIN } from '@/common/constants/scratch';
	import { useUserInfoStore } from '@/stores/userInfo.js';
	
	// 组件
	/**
	 * 刮刮乐弹出框
	 */
	const scratchInputDialog = ref(null);
	
	/**
	 * 刮刮乐表单
	 */
	const scratchForm = ref(null);
	
	/**
	 * 领取奖励弹出框
	 */
	const claimRewardInputDialog = ref(null);
	
	/**
	 * 领取奖励表单
	 */
	const claimRewardForm = ref(null);
	
	/**
	 * 计时弹出框
	 */
	const timeTrackInputDialog = ref(null);
	
	/**
	 * 计时表单
	 */
	const timeTrackForm = ref(null);
	
	
	// 属性
	/**
	 * 用户信息
	 */
	const userInfoStore = useUserInfoStore();

	/**
	 * 用户信息
	 */
	const userInfo = ref({
		totalRewardNum: 0,
		unclaimedRewardNum: 0,
		claimedRewardNum: 0,
		lotteryInvestAmount: 0.00,
		lotteryWinAmount: 0.00
	});
	
	/**
	 * 打卡任务
	 */
	const punchIns = ref([]);
	
	/**
	 * 刮刮乐表单数
	 */
	const scratchFormData = ref({});
	
	/**
	 * 刮刮乐表单校验规则
	 */
	const scratchFormRules = ref({
		"source": {
			rules: [{
				required: true,
				errorMessage: "请选择来源"
			}]
		},
		"category": {
			rules: [{
				required: true,
				errorMessage: "请选择种类"
			}]
		},
		"amount": {
			rules: [{
				required: true,
				errorMessage: "请输入金额"
			}, {
				format: 'number',
				errorMessage: "请输入有效数字"
			}, {
				minimum: 0.01,
				errorMessage: "最小{minimum}元"
			}]
		}
	
	});
	
	/**
	 * 领取奖励表单数据
	 */
	const claimRewardFormData = ref({
		claimRewardNum: 1
	});
	
	/**
	 * 领取奖励表单规则
	 */
	const claimRewardFormRules = ref({
		claimRewardNum: {
			rules: [{
				required: true,
				errorMessage: "请输入领取的奖励数"
			}, {
				format: 'number',
				errorMessage: "请输入有效数字"
			}, {
				minimum: 1,
				errorMessage: "最少领取{minimum}个"
			}]
		}
	});
	
	/**
	 * 计时表单数据
	 */
	const timeTrackFormData = ref({
		timeTrack: '00:00'
	});
	
	/**
	 * 计时表单规则
	 */
	const timeTrackFormRules = ref({
		timeTrack: {
			rules: [{
				required: true,
				errorMessage: "请输入时间"
			}]
		}
	});
	
	
	// 方法
	/**
	 * 获取用户信息
	 */
	const getUserInfo = async () => {
		let res = await userApi.queryUserInfo();
		userInfo.value = res;
	}

	/**
	 * 获取打卡
	 */
	const getPunchIns = async () => {
		let res = await punchInApi.queryPunchIns();
		punchIns.value = res;
	}
	
	/**
	 * 增加刮刮乐记录
	 */
	const addScratchRecord = async (e) => {
		// 重置上一轮的表单数据
		scratchFormData.value = {
			actionType: e
		};
		scratchInputDialog.value.open();
	}
	
	/**
	 * 刮刮乐表单提交
	 */
	const scratchFormConfirm = async () => {
		scratchForm.value.validate(['actionType']).then(data => {
			return scratchApi.addScratchRecord(data);
		}).then(e => {
			scratchInputDialog.value.close();
			getUserInfo();
		});
	}
	
	/**
	 * 刮刮乐表单取消
	 */
	const scratchFormClose = async () => {
		scratchInputDialog.value.close();
	}
	
	/**
	 * 领取奖励（部分）
	 * @param {String} claimType 部分领取或全部领取(part-部分/all-全部)
	 */
	const claimReward = (claimType) => {
		if (userInfo.value.unclaimedRewardNum == 0) {
			uni.showToast({
				title: "没有可领取的奖励",
				icon: "none"
			});
			return;
		}
		// 重置上一轮的表单数据
		claimRewardFormData.value = {
			claimRewardNum: claimType == 'part' ? 1 : userInfo.value.unclaimedRewardNum
		};
		claimRewardInputDialog.value.open();
	}
	
	
	/**
	 * 领取奖励表单提交
	 */
	const claimRewardFormConfirm = async () => {
		claimRewardForm.value.validate().then(data => {
			return rewardApi.claimReward(data);
		}).then(e => {
			claimRewardInputDialog.value.close();
			getUserInfo();
		});
	}
	
	/**
	 * 领取奖励表单取消
	 */
	const claimRewardFormClose = async () => {
		claimRewardInputDialog.value.close();
	}

	/**
	 * 确认领取奖励
	 */
	const claimRewardConfirm = async (val) => {
		await rewardApi.claimReward({
			"claimRewardNum": val
		});
		// getReward();
		claimRewardDialog.value.close();
	}
	
	/**
	 * 计时时间选择监听
	 */
	const timeTrackChange = (e) => {
		timeTrackFormData.value.timeTrack = e.detail.value;
	}
	
	/**
	 * 打卡（计时）
	 */
	const doPunchInForTimeTrack = (id, timeTrack) => {
		// 重置上一轮的表单数据
		timeTrackFormData.value = {
			id,
			timeTrack: timeTrack ? timeTrack.slice(0, 5) : '00:00'
		};
		timeTrackInputDialog.value.open();
	}
	
	/**
	 * 计时表单提交
	 */
	const timeTrackFormConfirm = async () => {
		timeTrackForm.value.validate(['id']).then(data => {
			return punchInApi.doPunchIn(data);
		}).then(e => {
			timeTrackInputDialog.value.close();
			getPunchIns();
		});
	}
	
	/**
	 * 刮刮乐表单取消
	 */
	const timeTrackFormClose = async () => {
		timeTrackInputDialog.value.close();
	}


	/**
	 * 打卡
	 */
	const doPunchIn = async (id) => {
		await punchInApi.doPunchIn({
			id
		});
		getPunchIns();
	}

	/**
	 * 跳转用户用心
	 */
	const goUserInfoPage = () => {
		uni.navigateTo({
			url: router.USER_INFO_URL
		});
	}

	/**
	 * 跳转打卡编辑页面
	 */
	const goPunchInEditPage = () => {
		uni.navigateTo({
			url: router.PUNCHIN_EDIT_URL
		});
	};
	
	/**
	 * 跳转打卡详情页面
	 */
	const goPunchInDetailPage = (id) => {
		uni.navigateTo({
			url: router.PUNCHIN_DETAIL_URL + "?id=" + id
		});
	};
	
	/**
	 * 加载数据
	 */
	const loadData = async () => {
		// 如果还没登录就结束获取数据
		if (!userInfoStore.isLogin) {
			userInfo.value = {
				totalRewardNum: 0,
				unclaimedRewardNum: 0,
				claimedRewardNum: 0,
				lotteryInvestAmount: 0.00,
				lotteryWinAmount: 0.00
			};
			punchIns.value = [];
			return;
		}
		
		// 已登录
		// isLogin.value = true;
		try {
			uni.showLoading({
				title: '加载中',
				mask: true
			});
			// 获取用户信息
			getUserInfo();
			// 获取打卡
			getPunchIns();
		} finally {
			uni.hideLoading();
		}
	};

	onShow(() => {
		loadData();
	});

	onPullDownRefresh(() => {
		loadData();
		uni.stopPullDownRefresh();
	});
</script>

<style lang="scss" scoped>
	.user-info {
		display: flex;
		align-items: center;
		position: relative;
		
		.user-icon {
			display: inline-flex !important;
			
			width: 72rpx;
			height: 72rpx;
			background: #FFFFFF;
			border-radius: 50%;
			
			justify-content: center;
			align-items: center;
		}
		
		.nickname {
			margin-left: 16rpx;
			font-size: 24rpx;
			font-weight: 400;
			letter-spacing: 0rpx;
			line-height: 34.75rpx;
			color: #000000;
		}
		
		.user-btn {
			position: absolute;
			right: 0px;
			
			width: 122rpx;
			height: 40rpx;
			opacity: 1;
			border-radius: 24rpx;
			background: #FFFFFF;
			border: 1px solid #406CE7;
			
			/** 文本1 */
			font-size: 18rpx;
			font-weight: 400;
			letter-spacing: 0rpx;
			line-height: 26.06rpx;
			color: #406CE7;
			
			display: flex;
			align-items: center;
			justify-content: center;
		}
	}

	.settle-container {
		margin-top: 16rpx;
		display: flex;
		
		padding: 16rpx 24rpx;
		height: 266rpx;
		
		opacity: 1;
		background: #406CE7;
		border-radius: 21.35rpx;
		border: 0.5px solid #E4E4E4;
		box-shadow: 0px 1px 6px  #D8D8D8;
		
		position: relative;
		
		.left-box {
			flex: 1;
			display: flex;
			flex-direction: column;
			 
			border-right: 1px solid #FFFFFF;
			padding-right: 24rpx;
			font-size: 22rpx;
			font-weight: 400;
			letter-spacing: 0rpx;
			line-height: 31.86rpx;
			color: #FFFFFF;
			
			.line-box {
				padding-bottom: 16rpx;
				border-bottom: 1px solid #FFFFFF;
				position: relative;
			}
			
			.under-line-box {
				padding-top: 16rpx;
				position: relative;
			}
			
			.number-box {
				position: absolute;
				right: 0px;
				text-align: right;
			}
			
			.split-box {
				flex: 1;
				display: flex;
				justify-content: center;
				align-content: center;
				flex-direction: column;
			}
		}
		
		.right-box {
			flex: 2;
			display: flex;
			flex-direction: column;
			align-items: center;
			
			.reward-title {
				font-size: 26rpx;
				font-weight: 400;
				letter-spacing: 0rpx;
				line-height: 37.65rpx;
				color: #FFFFFF;
			}
			
			.reward-num {
				flex-grow: 1;
				font-size: 120rpx;
				font-weight: 700;
				letter-spacing: 0rpx;
				color: #FFFFFF;
			}
			
			.reward-btn-group {
				width: 100%;
				height: 36rpx;
				
				display: flex;
				align-items: center;
				justify-content: center;
				
				.reward-btn-left {
					display: flex;
					justify-content: center;
					align-items: center;
						
					width: 108rpx;
					height: 36rpx;
					opacity: 1;
					border-radius: 24rpx 0rpx 0rpx 24rpx;
					background: #FFFFFF;
					
					font-size: 20rpx;
					font-weight: 700;
					letter-spacing: 0rpx;
					line-height: 28.96rpx;
					color: #406CE7;
				}
				
				.reward-btn-right {
					margin-left: 5rpx;
					display: flex;
					justify-content: center;
					align-items: center;
					
					width: 108rpx;
					height: 36rpx;
					opacity: 1;
					border-radius: 0rpx 24rpx 24rpx 0rpx;
					background: #FFFFFF;
					
					font-size: 20rpx;
					font-weight: 700;
					letter-spacing: 0rpx;
					line-height: 28.96rpx;
					color: #406CE7;
				}
			}
		}
	
		.refresh-btn {
			position: absolute;
			top: 16rpx;
			right: 24rpx;
			border-radius: 50%;
			
			width: 36rpx;
			height: 36rpx;
			opacity: 1;
			background: #F7F7F7;
			
			display: flex;
			justify-content: center;
			align-items: center;
		}
	}
	
	.task-container {
		margin-top: 16rpx;
	
		.task-header {
			position: relative;
			height: 80rpx;
			display: flex;
			justify-content: center;
			/* 水平居中 */
			align-items: center;
			/* 垂直居中 */
	
			.task-title {
				position: absolute;
				left: 0rpx;
				font-size: 30rpx;
				font-weight: 400;
				line-height: 43.44rpx;
				color: rgba(0, 0, 0, 1);
			}
	
			.task-add-btn {
				display: inline-flex;
				justify-content: center;
				align-items: center;
				position: absolute;
				right: 0rpx;
				width: 60rpx;
				height: 60rpx;
				border-radius: 10rpx;
				border: 3px solid rgba(64, 108, 231, 1);
			}
		}
	
		.task-item {
			margin-top: 16rpx;
			width: 100%;
			// height: 239rpx;
			border-radius: 24rpx;
			background: #FFFFFF;
			border: 0.5px solid #E4E4E4;
			box-shadow: 0px 1px 6px  #D8D8D8;
	
			display: flex;
			
			.main-box {
				flex-grow: 1;
				padding: 16rpx 16rpx 16rpx 24rpx;
				
				.item-header {
					// position: relative;
					display: flex;
					align-items: center;
					
					.item-title {
						font-size: 30rpx;
						font-weight: 400;
						letter-spacing: 0rpx;
						line-height: 43.44rpx;
						color: #000000;
					}
					
					.item-reward {
						margin-left: 8rpx;
						font-size: 24rpx;
						font-weight: 400;
						letter-spacing: 0rpx;
						line-height: 34.75rpx;
						color: #000000;
					}
					
					.item-tag:first-child {
						margin-left: 24rpx;
					}
										
					.item-tag {
						margin-left: 16rpx;
						width: 94rpx;
						height: 38rpx;
						opacity: 1;
						border-radius: 24rpx;
						background: #FFFFFF;
						border: 1px solid #406CE7;
						
						display: inline-flex;
						justify-content: center;
						align-items: center;
						
						font-size: 18rpx;
						font-weight: 400;
						letter-spacing: 0rpx;
						// line-height: 26.06rpx;
						color: #406CE7;
						
					}
					
					.item-btn {
						display: inline-flex;
						position: absolute;
						right: 0rpx;
						width: 123rpx;
						height: 42rpx;
						border-radius: 30rpx;
						border: 1rpx solid #2A82E4;
						justify-content: center;
						align-items: center;
					
						font-size: 20rpx;
						font-weight: 400;
						line-height: 28.96px;
						color: rgba(64, 108, 231, 1);
					}
				}
				
				.item-desc {
					margin-top: 16rpx;
					font-size: 24rpx;
					font-weight: 400;
					letter-spacing: 0rpx;
					line-height: 34.75rpx;
					color: #000000;
				}
				
				.item-detail-list {
					margin-top: 16rpx;
					display: grid;
					grid-template-columns: repeat(7, 1fr);
					
					.item-detail {
						display: flex;
						flex-direction: column;
						justify-content: center;
						align-items: center;
					
						.detail-text {
							font-size: 20rpx;
							font-weight: 400;
							letter-spacing: 0rpx;
							line-height: 28.96rpx;
							color: rgba(0, 0, 0, 1);
						}
					
						.detail-box {
							// display: block;
							width: 42rpx;
							height: 42rpx;
							margin-top: 5rpx;
							border: 5rpx solid #000000;
						}
					}
				}
			}
			
			.func-box {
				flex-shrink: 0;
				width: 160rpx;
				border-radius: 0rpx 24rpx 24rpx 0rpx;
				
				
				font-size: 36rpx;
				font-weight: 400;
				letter-spacing: 0rpx;
				line-height: 52.13rpx;
				color: #FFFFFF;
				
				display: flex;
				justify-content: center;
				align-items: center;
				flex-direction: column;
			}
			
			.func-box-finish {
				background: #F2607A;
			}
			
			.func-box-unfinish {
				background: #406CE7;
			}
		}
	}
	
	.pick-box {
		display: flex;
		box-sizing: border-box;
		flex-direction: row;
		align-items: center;
		border: 1px solid #dcdfe6;
		border-radius: 4px;
		
		width: auto;
		position: relative;
		overflow: hidden;
		flex: 1;
		line-height: 1;
		font-size: 14px;
		height: 35px;
		padding-left: 10px;
	}
</style>