// 跳转类型枚举
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);

      if(extra.embedded){
        uni.openEmbeddedMiniProgram(jumpParams);
      }else{
        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("不支持的跳转类型");
  }
}

export function formatDate(timestamp){
  const date = new Date(timestamp);
  if (isNaN(date.getTime())) {
      console.error('无效的时间戳:', timestamp);
      return '';
  }
  
  const year = date.getFullYear()
  const month = String(date.getMonth() + 1).padStart(2, '0')
  const day = String(date.getDate()).padStart(2, '0')
  return `${year}-${month}-${day}`
}

/**
 * 防连点函数
 * @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();
  }
}

/**
 * 日期格式化
 * @param date    接收可以被new Date()方法转换的内容
 * @param format  字符串，需要的格式例如：'yyyy/MM/dd hh:mm:ss'
 * @returns {String}
 */
 const dateFormatter = (date, format = "yyyy/MM/dd") => {
  if (!date) return "-";
  date = new Date(
    typeof date === "string" && isNaN(date)
      ? date.replace(/-/g, "/")
      : Number(date)
  );
  const o = {
    "M+": date.getMonth() + 1,
    "d+": date.getDate(),
    "h+": date.getHours(),
    "m+": date.getMinutes(),
    "s+": date.getSeconds(),
    "q+": Math.floor((date.getMonth() + 3) / 3),
    S: date.getMilliseconds(),
  };
  if (/(y+)/.test(format)) {
    format = format.replace(
      RegExp.$1,
      (date.getFullYear() + "").substr(4 - RegExp.$1.length)
    );
  }
  for (const k in o) {
    if (new RegExp("(" + k + ")").test(format)) {
      format = format.replace(
        RegExp.$1,
        RegExp.$1.length === 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length)
      );
    }
  }
  return format;
};
export {
	dateFormatter
}