import { ref } from 'vue'
import { defineStore } from 'pinia'
import { resetRouter } from '../../router'
import { customStorage } from '../persist'
import userRoutes from '@/config/routes'

export const useUserStore = defineStore(
	'user',
	() => {
		const token = ref('')
		const userInfo = ref(null)
		const menu = ref([])
		const permissions = ref([])

		// 设置 token
		function setToken(newToken) {
			token.value = newToken
		}

		// 设置用户信息
		function setUserInfo(info) {
			userInfo.value = info
		}

		// 设置菜单
		function setMenu(newMenu) {
			const staticMenus = userRoutes || []

			// 合并静态菜单和后端菜单
			// 如果后端菜单为空，只使用静态菜单
			// 如果后端菜单不为空，合并两个菜单，后端菜单优先
			let mergedMenus = [...staticMenus]

			if (newMenu && newMenu.length > 0) {
				// 创建菜单映射，用于去重（以路径为唯一标识）
				const menuMap = new Map()

				// 先添加静态菜单
				staticMenus.forEach((menu) => {
					if (menu.path) {
						menuMap.set(menu.path, menu)
					}
				})

				// 添加后端菜单，如果路径重复则覆盖
				newMenu.forEach((menu) => {
					if (menu.path) {
						menuMap.set(menu.path, menu)
					}
				})

				// 转换为数组
				mergedMenus = Array.from(menuMap.values())
			}
			menu.value = mergedMenus
		}

		// 获取菜单
		function getMenu() {
			return menu.value
		}

		// 清除菜单
		function clearMenu() {
			menu.value = []
		}

		// 设置权限
		function setPermissions(data) {
			permissions.value = data
		}

		// 登出
		function logout() {
			token.value = ''
			userInfo.value = null
			menu.value = []

			// 重置路由
			resetRouter()
		}

		// 检查是否已登录
		function isLoggedIn() {
			return !!token.value
		}

		// 检查用户信息是否完整（用于 WebSocket 初始化）
		function isUserInfoComplete() {
			return !!(token.value && userInfo.value && userInfo.value.id)
		}

		return {
			token,
			userInfo,
			menu,
			setToken,
			setUserInfo,
			setMenu,
			getMenu,
			clearMenu,
			setPermissions,
			logout,
			isLoggedIn,
			isUserInfoComplete,
		}
	},
	{
		persist: {
			key: 'user-store',
			storage: customStorage,
			pick: ['token', 'userInfo', 'menu'],
		},
	},
)
