/**
 * JWT解析工具
 */

/**
 * 解析JWT令牌
 * @param {string} token JWT令牌
 * @returns {Object} 解析后的用户信息
 */
export function parseJWT(token) {
  try {
    // 将JWT分割为三部分
    const parts = token.split('.');
    if (parts.length !== 3) {
      throw new Error('无效的JWT格式');
    }
    
    // 解码载荷部分（第二部分）
    const payload = parts[1];
    const decodedPayload = decodeBase64URL(payload);
    const payloadObj = JSON.parse(decodedPayload);
    
    // 如果存在UserInfo字段，解析它
    if (payloadObj.UserInfo) {
      try {
        payloadObj.UserInfo = JSON.parse(payloadObj.UserInfo);
      } catch (e) {
        console.error('解析UserInfo失败:', e);
      }
    }
    
    return payloadObj;
  } catch (error) {
    console.error('JWT解析失败:', error);
    return null;
  }
}

/**
 * 解码Base64URL编码的字符串
 * @param {string} base64Url Base64URL编码的字符串
 * @returns {string} 解码后的字符串
 */
function decodeBase64URL(base64Url) {
  // 将Base64URL转换为标准Base64
  const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
  
  // 添加填充字符
  const padding = '='.repeat((4 - base64.length % 4) % 4);
  const base64Padded = base64 + padding;
  
  // 解码Base64
  try {
    // 浏览器环境
    return decodeURIComponent(
      atob(base64Padded)
        .split('')
        .map(c => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2))
        .join('')
    );
  } catch (e) {
    // Node.js环境或其他环境
    try {
      return Buffer.from(base64Padded, 'base64').toString('utf-8');
    } catch (e2) {
      console.error('Base64解码失败:', e2);
      return '';
    }
  }
}

/**
 * 从JWT中获取用户信息
 * @param {string} token JWT令牌
 * @returns {Object} 用户信息对象
 */
export function getUserInfoFromJWT(token) {
  const parsedToken = parseJWT(token);
  if (!parsedToken || !parsedToken.UserInfo) {
    return null;
  }
  return parsedToken.UserInfo;
} 