/**
 * 认证工具函数
 * 提供登录状态检查、token管理等功能
 */

import { logger } from './logger';

/**
 * 获取本地存储的token
 */
export const getToken = (): string => {
  const token = uni.getStorageSync('accessToken');
  logger.log('[Auth] 获取token:', token ? '存在(长度:' + token.length + ')' : '不存在');
  return token || '';
};

/**
 * 保存token到本地存储
 */
export const setToken = (token: string): void => {
  logger.log('[Auth] 保存token:', token ? '有效(长度:' + token.length + ')' : '无效');
  uni.setStorageSync('accessToken', token);

  // 验证保存是否成功
  const saved = uni.getStorageSync('accessToken');
  logger.log('[Auth] 保存后验证:', saved === token ? '成功' : '失败');
};

/**
 * 清除本地存储的token
 */
export const removeToken = (): void => {
  uni.removeStorageSync('accessToken');
};

/**
 * 检查是否已登录
 */
export const isLoggedIn = (): boolean => {
  return !!getToken();
};

/**
 * 获取用户信息
 */
export const getUserInfo = (): any => {
  return uni.getStorageSync('haha-user-info') || null;
};

/**
 * 保存用户信息
 */
export const setUserInfo = (userInfo: any): void => {
  uni.setStorageSync('haha-user-info', userInfo);
};

/**
 * 清除用户信息
 */
export const removeUserInfo = (): void => {
  uni.removeStorageSync('haha-user-info');
};

/**
 * 清除所有登录信息及会话数据
 */
export const clearAuth = (): void => {
  removeToken();
  removeUserInfo();
  // 清除购物流程相关数据
  uni.removeStorageSync('currentDeviceId');
  uni.removeStorageSync('currentOutTradeNo');
  uni.removeStorageSync('currentOrderNo');
  uni.removeStorageSync('shoppingPollingActive');
};

/**
 * 路由守卫：检查登录状态
 * 如果未登录，则跳转到登录页
 * @param redirectUrl 登录后要跳转的页面（可选）
 * @returns 是否已登录
 */
export const checkAuth = (redirectUrl?: string): boolean => {
  if (!isLoggedIn()) {
    // 构建登录页URL，带上redirect参数
    let loginUrl = '/pages/login/login';
    if (redirectUrl) {
      loginUrl += `?redirect=${encodeURIComponent(redirectUrl)}`;
    }

    uni.reLaunch({
      url: loginUrl
    });

    return false;
  }

  return true;
};

/**
 * 全局401未授权处理
 * 清除所有登录信息并跳转到登录页
 * 任何接口遇到401时都应调用此函数
 * 内置防重入保护：同一时间只执行一次跳转
 */
let unauthorizing = false;
export const handleUnauthorized = (): void => {
  if (unauthorizing) {
    logger.log('[Auth] 已在处理未授权跳转，跳过重复调用');
    return;
  }
  unauthorizing = true;
  logger.log('[Auth] token无效或已过期，清除登录信息并跳转登录页');
  clearAuth();
  uni.reLaunch({
    url: '/pages/login/login',
    complete: () => {
      unauthorizing = false;
    }
  });
};

/**
 * 退出登录
 */
export const logout = (): void => {
  clearAuth();
  uni.reLaunch({
    url: '/pages/login/login'
  });
};
