<template>
	<view>
		<!-- 定位失败提示 -->
		<view v-if="locationError" class="location-error">
			<view class="location-error-content">
				<text class="location-error-text">无法获取位置信息，活动距离可能不准确</text>
				<u-button size="mini" type="primary" @click="retryLocation" class="location-error-btn">重新定位</u-button>
			</view>
		</view>
		
		<view class="listActivity">
			<u-empty mode="list" text="暂无活动" marginTop="50" v-if="list.length==0&&!isloading"></u-empty>
			<view class="activityBox" v-for="(item,index) in list" :key="index" @click="openInfo(item)">
				<view :class="!item.isCanBook?'gray100':''"></view>
				<view class="activityBox-top">
					<image :src='item.cover_upload.url' style="width: 100%;height: 333rpx;"></image>
				</view>
				<view class="activityBox-content flex-col">
					<view class="activityBox-row">
						<text class="activityBox-title">{{isUnde(item.name)}}</text>
					</view>
					<view class="activityBox-row flex-row justify-between">
						<view :class="item.type_name?'tag tag_green activityBox_btn':''">
							<text>{{isUnde(item.type_name)}}</text>
						</view>
						<block v-if="item.orders_count==item.total&&item.orders_count!=0">
							<view class="tag" v-if="item.isCanBook">
								<text>已约满</text>
							</view>
							<view class="tag" v-else>
								<text>{{item.rate_name}}</text>
							</view>
						</block>
						<block v-else>
							<view class="tag" :class="{activityBox_btn:item.isCanBook}">
								<text>{{item.isCanBook?"立即报名":"已结束"}}</text>
							</view>
						</block>
					</view>

					<view class="activityBox-row" style="display: flex;">
						<view style="display: inline-block;">
							<text class="icon-shijian iconfont"></text>活动场次：
						</view>
						<view style="display: flex;flex-direction: column;">
							<block v-for="(k,index) in item.numbers">
								<view v-if="index<2" class="tag tag_green activityBox_btn activityBox_time" style="margin-top: -5px;margin-bottom: 10px;">
									<text style="margin-right:12rpx">
										{{timeFormat(k.start_time,"MM月DD日")}}
									</text>
									<text>
										{{getHm(k.start_time)}}-{{getHm(k.end_time)}}
									</text>
								</view>
							</block>
							
						</view>

						<view v-if="item.numbers.length>2"
							class="activityMore">
							更多>>
						</view>
					</view>

					<view class="activityBox-row">
						<text class="icon-huodong iconfont"></text>
						<text>活动地址：{{isUnde(item.address)}}</text>
					</view>

					<view class="activityBox-row flex-row align-center" style="margin-bottom: 0rpx;"
						@click.stop="tothere(item)">
						<text class="icon-ditu-dibiao iconfont"></text>
						<text>距离：{{isUnde(item.distance)}}km</text>
						<view class="tomap">
							<text class="icon-daohang1 iconfont" style="margin-right: 0;"></text>
						</view>
					</view>

				</view>
			</view>
		</view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				showInfo: true,
				list: [],
				latitude: "",
				longitude: "",
				isloading: true,
				locationError: false // 定位是否失败
			}
		},
		onLoad() {
			var that = this;
			
			// 检测运行环境
			const isH5 = typeof window !== 'undefined' && window.location
			
			if (isH5) {
				// H5环境：使用浏览器定位API
				if (navigator.geolocation) {
					navigator.geolocation.getCurrentPosition(
						function(position) {
							that.latitude = position.coords.latitude;
							that.longitude = position.coords.longitude;
							console.log('定位成功:', that.latitude, that.longitude);
							that.loadActivity()
						},
						function(error) {
							console.log('定位失败:', error);
							that.locationError = true;
							
							// 根据错误类型给出不同提示
							switch(error.code) {
								case error.PERMISSION_DENIED:
									console.log('用户拒绝了定位权限');
									break;
								case error.POSITION_UNAVAILABLE:
									console.log('位置信息不可用');
									break;
								case error.TIMEOUT:
									console.log('定位超时');
									break;
								default:
									console.log('定位失败，未知错误');
									break;
							}
							// 定位失败时仍然加载活动列表
							that.loadActivity()
						},
						{
							enableHighAccuracy: true,
							timeout: 15000, // 增加超时时间到15秒
							maximumAge: 300000 // 缓存5分钟
						}
					);
				} else {
					console.log('浏览器不支持定位');
					uni.showToast({
						title: '浏览器不支持定位功能',
						icon: 'none'
					});
					that.loadActivity()
				}
			} else {
				// 小程序环境：使用wx.getLocation
				wx.getLocation({
					success(res) {
						console.log(res)
						that.latitude = res.latitude;
						that.longitude = res.longitude;
						that.loadActivity()
					},
					fail(err) {
						console.log('定位失败:', err);
						that.loadActivity()
					}
				})
			}
		},
		onShareAppMessage() {
			return this.util.shareInfo
		},
		
		onShareTimeline(){
			return this.util.shareInfo
		},
		methods: {
			// 重新定位
			retryLocation() {
				this.locationError = false;
				this.latitude = "";
				this.longitude = "";
				
				const isH5 = typeof window !== 'undefined' && window.location;
				var that = this;
				
				if (isH5 && navigator.geolocation) {
					navigator.geolocation.getCurrentPosition(
						function(position) {
							that.latitude = position.coords.latitude;
							that.longitude = position.coords.longitude;
							console.log('重新定位成功:', that.latitude, that.longitude);
							that.loadActivity();
						},
						function(error) {
							console.log('重新定位失败:', error);
							that.locationError = true;
							uni.showToast({
								title: '定位失败，请检查浏览器定位权限',
								icon: 'none',
								duration: 3000
							});
						},
						{
							enableHighAccuracy: true,
							timeout: 15000,
							maximumAge: 0 // 不使用缓存，重新获取
						}
					);
				}
			},
			tothere(item) {
				uni.openLocation({
					latitude: parseFloat(item.latitude),
					longitude: parseFloat(item.longitude),
					name: item.name,
					address: item.address
				})
			},
			openInfo(obj) {

				uni.navigateTo({
					url: "info?id=" + obj.id
				})
			},
			loadActivity() {
				console.log("加载活动列表")
				var that = this;
				var nt = new Date();
				that.isloading = true;
				
				// 构建请求参数
				var requestData = {
					page_size: 100
				};
				
				// 如果有定位信息，添加到请求参数中
				if (that.latitude && that.longitude) {
					requestData.latitude = that.latitude;
					requestData.longitude = that.longitude;
				}
				
				this.util.request({
					api: '/api/mobile/activity/index',
					data: requestData,
					utilSuccess: function(res) {
						for (var mod of res.data) {
							mod.isCanBook = that.$moment(nt).isBefore(mod.end_plan);
						}
						that.list = res.data;
						that.isloading = false;
					},
					utilFail: function(res) {
						that.isloading = false;
					}
				})
			},
			isUnde(val) {
				if (val) {
					return val
				} else {
					return ""
				}
			},
			getHm(val) {
				if (val) {
					return this.$moment(val).format("HH:mm")
				} else return "";
			},
			timeFormat(val, format) {
				return this.$moment(val).format(format)
			}
		}
	}
</script>

<style>
	@import url("@/static/css/activitybox.css");

	page {
		background-color: #f7f6f4;
	}
	.activityBox{
		position: relative;
	}
	.activityBox-title {
		font-size: 32rpx;
	}
	.activityBox-row{
		font-size: 28rpx;
	}
	.activityBox-top{
		font-size: 0;
	}
	.gray100{
		width:100%;
		height:333rpx;
		position: absolute;
		top:0;
		left:0;
		background-color: rgba(0,0,0,0.5);
		z-index:999;
		/* opacity: 50%;
		filter: grayscale(100%);
		opacity: 50%;
		-webkit-filter: blackscale(100%);
		filter: brightness(0.2); */
	}
	.activityBox_time {
		/* height: 70rpx; */
		vertical-align: middle;
		display: inline-block;
		margin: 4rpx;
		background: #FCF6E3;
		border: 2rpx solid #cf995a;
		border-radius: 20rpx;
		color: #4E4E4E;
		margin-right: 10rpx;
	}
	.activityMore{
		font-size: 26rpx;
		    font-family: PingFang SC;
		    font-weight: 400;
		    display: flex;
		    color: #cf995a;
		    flex-direction: column-reverse;
			margin-left:10rpx
	}
	
	.location-error {
		background-color: #fff3cd;
		border: 1px solid #ffeaa7;
		border-radius: 8rpx;
		margin: 20rpx;
		padding: 20rpx;
	}
	
	.location-error-content {
		display: flex;
		justify-content: space-between;
		align-items: center;
		font-size: 28rpx;
		color: #856404;
		flex-wrap: wrap;
		gap: 20rpx;
	}
	
	.location-error-text {
		flex: 1;
		min-width: 0;
		word-wrap: break-word;
		line-height: 1.4;
	}
	
	.location-error-btn {
		flex-shrink: 0;
		white-space: nowrap;
	}
</style>
