import router from './router';
import { ElMessage } from 'element-plus';
import NProgress from 'nprogress';
import 'nprogress/nprogress.css';
import { getToken, setToken } from '@/utils/auth';
import { isHttp } from '@/utils/validate';
import { isRelogin } from '@/utils/request';
import useUserStore from '@/store/modules/user';
import useSettingsStore from '@/store/modules/settings';
import usePermissionStore from '@/store/modules/permission';
import { callback, getMinioUrl } from '@/api/menu';
import useSystemStore from './store/main';
NProgress.configure({ showSpinner: false });

const whiteList = ['/login', '/register'];

router.beforeEach((to, from, next) => {
	NProgress.start();
	if (getToken()) {
		//  重置筛选项
		const systemStore = useSystemStore();
		const { searchObj, pageInfo } = storeToRefs(systemStore);
		searchObj.value = {};
		pageInfo.value = {
			pageNum: 1,
			pageSize: 10,
		};

		to.meta.title && useSettingsStore().setTitle(to.meta.title);
		/* has token*/
		if (to.path === '/login') {
			next({ path: '/' });
			NProgress.done();
		} else {
			/* TODO 暂时隐藏登陆逻辑 */
			// if (useUserStore().roles.length === 0) {
			//     isRelogin.show = true;
			//     // 判断当前用户是否已拉取完user_info信息
			//     useUserStore()
			//         .getInfo()
			//         .then(() => {
			//             isRelogin.show = false;
			//             usePermissionStore()
			//                 .generateRoutes()
			//                 .then(accessRoutes => {
			//                     // 根据roles权限生成可访问的路由表
			//                     accessRoutes.forEach(route => {
			//                         if (!isHttp(route.path)) {
			//                             router.addRoute(route); // 动态添加可访问路由表
			//                         }
			//                     });
			//                     next({ ...to, replace: true }); // hack方法 确保addRoutes已完成
			//                 });
			//         })
			//         .catch(err => {
			//             useUserStore()
			//                 .logOut()
			//                 .then(() => {
			//                     ElMessage.error(err);
			//                     next({ path: '/' });
			//                 });
			//         });
			// } else {
			//     next();
			// }
			next();
		}
	} else {
		// TODO 暂时使用 待联调登陆的时候删除
		setToken(
			'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpblR5cGUiOiJsb2dpbiIsImxvZ2luSWQiOiJzeXNfdXNlcjoxIiwicm5TdHIiOiJEZDdhT3JWSkxOWHBjUXFmWXVqQjRLWWlmaVJ0ZGJ5cSIsImNsaWVudGlkIjoiZTVjZDdlNDg5MWJmOTVkMWQxOTIwNmNlMjRhN2IzMmUiLCJ0ZW5hbnRJZCI6IjAwMDAwMCIsInVzZXJJZCI6MSwidXNlck5hbWUiOiJhZG1pbiIsImRlcHRJZCI6MTAzLCJkZXB0TmFtZSI6IueglOWPkemDqOmXqCIsImRlcHRDYXRlZ29yeSI6IiJ9.ewmlCaJqd6bzIeFCUX7ebOfDilhC0Qd6fRQjembIpoQ'
		);
		next();
		// 没有token
		if (whiteList.indexOf(to.path) !== -1) {
			// 在免登录白名单，直接进入
			next();
		} else if (to.fullPath.includes('code=')) {
			const codeFromUrl = to.fullPath.split('=')[1];
			callback(codeFromUrl).then((res: any) => {
				setToken(res.token);
				to.meta.title && useSettingsStore().setTitle(to.meta.title);
				/* has token*/
				if (to.path === '/login') {
					next({ path: '/' });
					NProgress.done();
				} else {
					if (useUserStore().roles.length === 0) {
						isRelogin.show = true;
						// 判断当前用户是否已拉取完user_info信息
						useUserStore()
							.getInfo()
							.then(() => {
								isRelogin.show = false;
								usePermissionStore()
									.generateRoutes()
									.then(accessRoutes => {
										// 根据roles权限生成可访问的路由表
										accessRoutes.forEach(route => {
											if (!isHttp(route.path)) {
												router.addRoute(route); // 动态添加可访问路由表
											}
										});
										next({ ...to, replace: true }); // hack方法 确保addRoutes已完成
									});
							})
							.catch(err => {
								useUserStore()
									.logOut()
									.then(() => {
										ElMessage.error(err);
										next({ path: '/' });
									});
							});
					} else {
						next();
					}
				}
				next();
			});
		} else if (process.env.NODE_ENV === 'production') {
			// 单点登录
			if (to.fullPath.includes('manage')) {
				next('/login');
			} else {
				location.href = `${import.meta.env.VITE_APP_BASE_API}/thirdPartyLogin`;
			}
		} else {
			// next(`/login?redirect=${to.fullPath}`); // 否则全部重定向到登录页
			next('/login');
			NProgress.done();
		}
	}
});

router.afterEach(() => {
	NProgress.done();
});
