<script>
	import {
		useConfigStore
	} from './store/config.js'
	import {
		useUserStore
	} from './store/user.js'
	import {
		useChatStore,
		MessageType
	} from './store/chat.js'
	import signalR from './utils/signalr.js'

	// 交换状态枚举
	const ExchangeStatus = {
		PENDING: 0,
		ACCEPTED: 1,
		REJECTED: 2
	}

	// 全局 SignalR 事件处理器引用（用于移除监听）
	let globalExchangeResponseHandler = null
	let globalReceiveMessageHandler = null

	/**
	 * 初始化全局 SignalR 连接和事件监听
	 * 用于在用户不在聊天页面时也能接收交换响应等通知
	 */
	async function initGlobalSignalR() {
		const userStore = useUserStore()
		const chatStore = useChatStore()

		if (!userStore.isLoggedIn) {
			console.log('[App] 用户未登录，跳过 SignalR 连接')
			return
		}

		// 获取未读消息数并更新badge
		chatStore.fetchAllUnreadCounts()

		try {
			// 连接 SignalR（如果已连接会直接返回）
			await signalR.connect()
			console.log('[App] 全局 SignalR 连接成功')

			// 移除旧的监听器（防止重复注册）
			if (globalExchangeResponseHandler) {
				signalR.off('ExchangeResponse', globalExchangeResponseHandler)
			}
			if (globalReceiveMessageHandler) {
				signalR.off('ReceiveMessage', globalReceiveMessageHandler)
			}

			// 全局监听交换响应事件
			globalExchangeResponseHandler = (message) => {
				console.log('[App] 全局收到交换响应:', message)

				// 如果当前在对应的聊天页面，由聊天页面处理，这里不重复处理
				if (message.sessionId && message.sessionId === chatStore.currentSessionId) {
					console.log('[App] 当前在聊天页面，跳过全局处理')
					return
				}

				// 更新 chatStore 中对应会话的消息状态
				if (message.extraData) {
					try {
						const extraData = typeof message.extraData === 'string' ?
							JSON.parse(message.extraData) :
							message.extraData

						const requestMessageId = extraData.RequestMessageId || extraData.requestMessageId
						const status = extraData.Status ?? extraData.status ?? ExchangeStatus.PENDING
						const sessionId = message.sessionId

						console.log('[App] 交换响应详情:', {
							requestMessageId,
							status,
							sessionId
						})

						// 更新 chatStore 中的消息
						if (sessionId && chatStore.messagesBySession[sessionId]) {
							const messages = chatStore.messagesBySession[sessionId]
							const requestMsg = messages.find(m => m.id === requestMessageId)
							if (requestMsg) {
								requestMsg.status = status
								console.log('[App] 已更新消息状态:', requestMessageId, status)

								// 如果同意了交换，更新交换的数据
								if (status === ExchangeStatus.ACCEPTED) {
									if (requestMsg.messageType === MessageType.EXCHANGE_WECHAT) {
										requestMsg.exchangedContent = extraData.senderWeChat || extraData
											.receiverWeChat ||
											extraData.SenderWeChat || extraData.ReceiverWeChat
									} else if (requestMsg.messageType === MessageType.EXCHANGE_PHOTO) {
										requestMsg.photos = extraData.senderPhotos || extraData.receiverPhotos ||
											extraData.SenderPhotos || extraData.ReceiverPhotos
										requestMsg.photoCount = requestMsg.photos?.length || 0
									}
								}
							}
						}

						// 显示通知提示
						const isAccepted = status === ExchangeStatus.ACCEPTED
						const typeText = message.messageType === 5 ? '微信' : '照片'
						uni.showToast({
							title: isAccepted ? `对方已同意交换${typeText}` : `对方已拒绝交换${typeText}`,
							icon: 'none',
							duration: 2000
						})
					} catch (e) {
						console.error('[App] 解析交换响应数据失败:', e)
					}
				}
			}

			// 全局监听新消息事件（用于更新未读数等）
			globalReceiveMessageHandler = (message) => {
				console.log('[App] 全局收到新消息:', message)

				// 如果当前在对应的聊天页面，由聊天页面处理，这里不重复处理
				if (message.sessionId && message.sessionId === chatStore.currentSessionId) {
					console.log('[App] 当前在聊天页面，跳过全局处理')
					return
				}

				// 不在聊天页面时，增加未读数并更新badge
				if (message.sessionId) {
					chatStore.incrementUnreadCount(message.sessionId)
				}
			}

			signalR.on('ExchangeResponse', globalExchangeResponseHandler)
			signalR.on('ReceiveMessage', globalReceiveMessageHandler)

			console.log('[App] 全局 SignalR 事件监听已注册')
		} catch (err) {
			console.error('[App] 全局 SignalR 连接失败:', err)
		}
	}

	export default {
		onLaunch: function() {
			console.log('App Launch')
			// 恢复用户状态
			const userStore = useUserStore()
			userStore.restoreFromStorage()

			// 加载所有配置（一次请求）
			const configStore = useConfigStore()
			configStore.loadAppConfig()

			// 初始化全局 SignalR 连接
			initGlobalSignalR()
		},
		onShow: function() {
			console.log('App Show')
			// 应用从后台切回前台时，重新连接 SignalR
			initGlobalSignalR()
		},
		onHide: function() {
			console.log('App Hide')
		}
	}
</script>

<style>
	/*每个页面公共css */
</style>