// 跳转类型枚举
export const JumpType = {
  INNER: 1, // 内部小程序页面跳转
  MINI: 2, // 其他小程序页面跳转
  H5: 3, // https 网络连接跳转
};

/**
 * 通用跳转方法
 * @param {Object} options
 * @param {number} options.type 跳转类型（1-内部，2-小程序，3-H5）
 * @param {string} options.url 跳转地址（页面路径/小程序路径/https链接）
 * @param {Object} [options.extra] 额外参数（如 appId、extraData 等）
 */
export function jump({ type, url, extra = {} }) {
  switch (type) {
    case JumpType.INNER:
      // 内部小程序页面跳转
      uni.navigateTo({
        url,
        ...extra,
      });
      break;
    case JumpType.MINI:
      // 跳转到其他小程序页面
      console.log("extra:", url, extra);

      const jumpParams = {
        appId: extra.appId || "",
        path: url,
        extraData: extra.extraData || {},
        envVersion: extra.envVersion || "release",
        success: extra.success,
        fail: extra.fail,
      };

      console.log("jumpParams:", jumpParams);

      uni.navigateToMiniProgram(jumpParams);
      break;
    case JumpType.H5:
      // 跳转到 https 网络链接
      if (/^https?:\/\//.test(url)) {
        // uni-app 推荐用 webview 页面承载 H5
        uni.navigateTo({
          url: `/pages/webview/webview?url=${encodeURIComponent(url)}`,
        });
      } else {
        console.error("H5 跳转地址必须为 https 链接");
      }
      break;
    default:
      console.error("不支持的跳转类型");
  }
}

/**
 * 防连点函数
 * @param {Function} fn 需要防连点的函数
 * @param {number} [delay=1000] 防连点时间间隔(ms)
 * @returns {Function} 包装后的防连点函数
 */
export function throttleTap(fn, delay = 1000) {
  let timer = null;
  let lastTime = 0;

  return function (...args) {
    const now = Date.now();
    if (now - lastTime < delay) {
      // 小于间隔时间,阻止执行
      console.log("防连点");
      return;
    }

    lastTime = now;
    clearTimeout(timer);

    // 立即执行一次
    fn.apply(this, args);

    timer = setTimeout(() => {
      lastTime = 0; // 重置时间
    }, delay);
  };
}

let loadingCount = 0;
let loadingTimer = null;

export function showLoading() {
  if (loadingCount == 0) {
    uni.showLoading({
      title: "加载中",
      mask: true,
    });

    loadingTimer = setTimeout(() => {
      uni.hideLoading();
    }, 10000);
  }
  loadingCount++;
}

export function hideLoading() {
  if (loadingCount <= 0) return;

  loadingCount--;
  if (loadingCount == 0) {
    loadingTimer && clearTimeout(loadingTimer);
    uni.hideLoading();
  }
}
