import { ElMessage } from 'element-plus';
import { useUserStore } from '@/store/modules/user';
import { getCBrainRedirectUrl } from '@/utils/getRedirectUrl';
import { handleTokenFromUrl } from '@/utils/handleTokenFromUrl';
import { checkOAuthCode } from '@/api/system/user';
import { PageEnum } from '@/enums/pageEnum';
import type { NavigationGuardNext, RouteLocationNormalized } from 'vue-router';

/**
 * C大脑 OAuth2.0 单点登录路由前置守卫
 * - 无 code：重定向到 C大脑授权服务器
 * - 有 code：用 code 换 token，写存储，拉用户信息，再跳转首页
 */
export async function checkCBrainOAuthToken(
  to: RouteLocationNormalized,
  _from: RouteLocationNormalized,
  next: NavigationGuardNext,
) {
  const userStore = useUserStore();
  const codeFromUrl = to.query.code as string | undefined;

  if (!codeFromUrl) {
    window.location.href = getCBrainRedirectUrl();
    return;
  }

  // 有code：换取token
  try {
    // 单点登录OAuth2.0 通过code请求接口，获取token
    const { satoken } = await checkOAuthCode(codeFromUrl);
    userStore.setToken(satoken);
    handleTokenFromUrl(satoken);

    try {
      await userStore.GetInfo();
    } catch (err: any) {
      console.log('catch getInfo error', err);
      // c大脑登录失败的时候不需要跳转到登录页面
      ElMessage.error(err.message);
      return;
    }

    next(PageEnum.BASE_HOME);
  } catch {
    ElMessage.error('获取token失败');
  }
}
