/**
 * 认证工具类
 * 提供登录状态检查、token 管理等功能
 */

import { AppServer } from '@/modules/api/AppServer'

/**
 * 检查是否已登录
 * @returns {Boolean} 是否已登录
 */
export function isLoggedIn() {
	const token = uni.getStorageSync('token')
	return !!token
}

/**
 * 获取当前用户信息
 * @returns {Object|null} 用户信息
 */
export function getCurrentUser() {
	try {
		const userStr = uni.getStorageSync('user')
		if (userStr) {
			return JSON.parse(userStr)
		}
	} catch (e) {
		console.error('获取用户信息失败:', e)
	}
	return null
}

/**
 * 获取用户信息（别名）
 * @returns {Object|null} 用户信息
 */
export function getUserInfo() {
	return getCurrentUser()
}

/**
 * 保存用户信息
 * @param {Object} user - 用户信息
 */
export function saveUserInfo(user) {
	try {
		if (user) {
			const userStr = JSON.stringify(user)
			uni.setStorageSync('user', userStr)
			
			// 更新全局数据
			const app = getApp()
			if (app && app.globalData) {
				app.globalData.user = user
			}
		}
	} catch (error) {
		console.error('保存用户信息失败:', error)
		throw error
	}
}

/**
 * 获取 Token
 * @returns {String} Token
 */
export function getToken() {
	return uni.getStorageSync('token') || ''
}

/**
 * 保存认证信息
 * @param {String} token - 访问令牌
 * @param {String} refreshToken - 刷新令牌
 * @param {Object} user - 用户信息
 */
export function saveAuthData(token, refreshToken, user) {
	try {
		console.log('保存认证信息:', { token: token ? 'exists' : 'missing', refreshToken: refreshToken ? 'exists' : 'missing', user: user ? 'exists' : 'missing' });
		
		// 保存到本地存储
		if (token) {
			uni.setStorageSync('token', token)
			console.log('Token 已保存');
		}
		
		if (refreshToken) {
			uni.setStorageSync('refreshToken', refreshToken)
			console.log('RefreshToken 已保存');
		}
		
		if (user) {
			const userStr = JSON.stringify(user)
			uni.setStorageSync('user', userStr)
			console.log('用户信息已保存:', userStr);
		}
		
		// 更新全局数据
		const app = getApp()
		if (app && app.globalData) {
			app.globalData.token = token
			app.globalData.user = user
			app.globalData.loginTime = Date.now()
			console.log('全局数据已更新');
		}
		
		console.log('认证信息保存成功');
	} catch (error) {
		console.error('保存认证信息失败:', error);
		throw error;
	}
}

/**
 * 清除认证信息
 */
export function clearAuthData() {
	// 清除本地存储
	uni.removeStorageSync('token')
	uni.removeStorageSync('refreshToken')
	uni.removeStorageSync('user')
	
	// 清除全局数据
	const app = getApp()
	if (app && app.globalData) {
		app.globalData.token = ''
		app.globalData.user = null
	}
}

/**
 * 验证 Token 是否有效
 * @returns {Promise<Boolean>} Token 是否有效
 */
export async function validateToken() {
	if (!isLoggedIn()) {
		return false
	}
	
	try {
		const appServer = new AppServer()
		const result = await appServer.GetUserProfile()
		
		if (result.success) {
			// Token 有效，更新用户信息
			saveAuthData(getToken(), uni.getStorageSync('refreshToken'), result.data)
			return true
		} else {
			// Token 无效
			return false
		}
	} catch (error) {
		console.error('验证 Token 失败:', error)
		return false
	}
}

/**
 * 检查登录状态，如果未登录则跳转到登录页
 * @param {Boolean} showToast - 是否显示提示
 * @returns {Boolean} 是否已登录
 */
export function requireAuth(showToast = true) {
	if (!isLoggedIn()) {
		if (showToast) {
			uni.showToast({
				title: '请先登录',
				icon: 'none',
				duration: 1500
			})
		}
		
		setTimeout(() => {
			uni.navigateTo({
				url: '/pages/login/login-page'
			})
		}, showToast ? 1000 : 0)
		
		return false
	}
	return true
}

/**
 * 登出
 */
export async function logout() {
	try {
		// 调用登出接口
		const appServer = new AppServer()
		await appServer.Logout()
	} catch (error) {
		console.error('登出接口调用失败:', error)
	} finally {
		// 无论接口是否成功，都清除本地数据
		clearAuthData()
		
		// 清除其他页面，跳转到首页
		uni.reLaunch({
			url: '/pages/index/index'
		})
	}
}

/**
 * 刷新 Token
 * @returns {Promise<Boolean>} 是否刷新成功
 */
export async function refreshToken() {
	const refreshToken = uni.getStorageSync('refreshToken')
	if (!refreshToken) {
		return false
	}
	
	try {
		const appServer = new AppServer()
		const result = await appServer.RefreshToken(refreshToken)
		
		if (result.success && result.data && result.data.token) {
			// 保存新的 token
			saveAuthData(
				'Bearer ' + result.data.token,
				result.data.refreshToken || refreshToken,
				getCurrentUser()
			)
			return true
		} else {
			return false
		}
	} catch (error) {
		console.error('刷新 Token 失败:', error)
		return false
	}
}

export default {
	isLoggedIn,
	getCurrentUser,
	getToken,
	saveAuthData,
	clearAuthData,
	validateToken,
	requireAuth,
	logout,
	refreshToken
}
