import { RouteRecordRaw } from 'vue-router'
import XEUtils from 'xe-utils'
import i18n from '@/locales'
import { routes } from '@/router'
import { useUserStore } from '@/stores/user'
const { t } = i18n.global
export interface MenuNode {
	key: string
	name: string
	keyPath: string
	icon?: string
	path: string
	hidden: boolean
	parentKey?: string
	url?: string
	children?: MenuNode[]
}

export function router2Menu(r: RouteRecordRaw & { parentKey?: string; keyPath?: string }): MenuNode {
	const title = String(r.meta?.title)
	const keyPath = r.keyPath ?? String(r.name)
	return {
		key: String(r.name),
		name: t(title),
		icon: String(r.meta?.icon),
		hidden: !!r.meta?.hideInMenu,
		parentKey: r.parentKey,
		path: r.path,
		keyPath: keyPath,
	}
}

export function dynamicsRouters() {
	return XEUtils.mapTree(
		routes as (RouteRecordRaw & {
			parentKey?: string
			keyPath?: string
		})[],
		(item) => {
			const keyPath = item.keyPath ?? String(item.name)
			if (item.children) {
				item.children.map((c: RouteRecordRaw & { parentKey?: string; keyPath?: string }) => {
					return Object.assign(c, {
						parentKey: String(item.name),
						keyPath: c.keyPath ? c.keyPath : keyPath + '.' + String(c.name),
					})
				})
			}
			return Object.assign(item, { keyPath })
		},
	)
}

export function menuTree() {
	return XEUtils.mapTree(
		routes as (RouteRecordRaw & {
			parentKey?: string
			keyPath?: string
		})[],
		(item) => {
			const keyPath = item.keyPath ?? String(item.name)
			if (item.children) {
				item.children.map((c: RouteRecordRaw & { parentKey?: string; keyPath?: string }) => {
					return Object.assign(c, {
						parentKey: String(item.name),
						keyPath: c.keyPath ? c.keyPath : keyPath + '.' + String(c.name),
					})
				})
			}
			return router2Menu(item)
		},
	)
}

export function hasPermission(key?: string) {
	console.log(key)
	return useUserStore().hasPermission(key) // 过滤菜单是否显示
	// return true
}

export function permissions() {
	return XEUtils.toTreeArray(menuTree(), { clear: true }).filter((item) => !item.hidden)
}

export function permissionTree() {
	return XEUtils.toArrayTree(permissions(), { parentKey: 'parentKey', key: 'key' })
}

export function fliteredMenus() {
	return XEUtils.toTreeArray(menuTree(), { clear: true })
		.filter((item) => {
			return !item.hidden
		})
		.filter((item) => {
			if (item.key === 'Dashboard') return true //   首页显示
			return hasPermission(item.keyPath)
		})
}

export function fliteredMenuTree() {
	return XEUtils.toArrayTree(fliteredMenus(), { strict: true, parentKey: 'parentKey', key: 'key' })
}
/**
 * 全部菜单树
 * @returns 菜单树
 */
export function menus() {
	return fliteredMenuTree()
}

/**
 * 顶部菜单,split为true则返回一级菜单,为false则为全部菜单树
 * @param splite 是否拆分
 * @returns 菜单树
 */
export function topMenus(splite: boolean) {
	if (splite) {
		return menus().map((item) => {
			item.children = []
			return item
		})
	}
	return menus()
}

/**
 * 侧面拆分菜单
 * @returns 菜单树
 */
export function sideMenu(top: string) {
	return menus().find((item) => item.key === top)?.children || []
}
