/**
 * 提示方法
 * @param {String} title 提示文字
 * @param {String}  icon icon图片
 * @param {Number}  duration 提示时间
 */
export function toast(title, icon = "none", duration = 1500) {
  if (title) {
    uni.showToast({
      title,
      icon,
      duration,
    });
  }
}

/**
 * @param {String} url
 * @return {function}
 * @description navigateTo跳转
 */
export function Jump(url) {
  uni.navigateTo({
    url: url,
  });
}

/**
 * 提示信息
 * **/
export function showModal(title, msg, showCancel) {
  uni.showModal({
    title: title,
    content: msg,
    showCancel: showCancel,
    success: function (res) {},
  });
}

export function showLoading(content) {
  uni.showLoading({
    title: content,
  });
}
/**
 * 隐藏loading
 * **/
export function hideLoading() {
  uni.hideLoading();
}

/***
 * 获取时间戳
 */
export function getTimStamp() {
  var timestamp = Date.parse(new Date());
  timestamp = timestamp / 1000;
  return timestamp;
}
/***
 * 生成随机数
 */
export function getNonce() {
  var t = "";
  for (var i = 0; i < 12; i++) {
    t += Math.floor(Math.random() * 10);
  }
  return t;
}
/**
 * 获取32位随机数
 * ***/
export function getnoncestr() {
  let len = len || 32;
  var $chars = "abcdefghijklmnopqrstuvwxyz0123456789";
  var maxPos = $chars.length;
  var pwd = "";
  for (var i = 0; i < len; i++) {
    pwd += $chars.charAt(Math.floor(Math.random() * maxPos));
  }
  return pwd;
}

/**
 * 解析url中的参数
 */
export function UrlParamHash(url) {
  var params = {},
    h;
  var hash = url.slice(url.indexOf("?") + 1).split("&");
  for (var i = 0; i < hash.length; i++) {
    h = hash[i].split("=");
    if (h.length > 1) {
      params[h[0]] = h[1];
    } else {
      params[h[0]] = "";
    }
  }
  return params;
}

/**
 * 一键复制 uni.setClipboardData
 * 用法：
 *    1. import {setClipboardData} from '该文件的地址'
 *    2. 利用async await
 *    3. await setClipboardData(需要复制的文本)
 */
const setClipboardData = (text) => {
  return new Promise((resolve, reject) => {
    uni.setClipboardData({
      data: text,
      success: (res) => {
        resolve(res);
      },
      fail: (err) => {
        reject(err);
      },
    });
  });
};

/**
 * 获取系统剪贴板内容 uni.getClipboardData
 * 用法：
 *    1. import {getClipboardData} from '该文件的地址'
 *    2. 利用async await来接收获取到的数据
 *    3. await getClipboardData()
 */
const getClipboardData = () => {
  return new Promise((resolve, reject) => {
    uni.getClipboardData({
      success: (res) => {
        resolve(res);
      },
      fail: (err) => {
        reject(err);
      },
    });
  });
};

/**
 * 拨打电话 uni.makePhoneCall()
 * 用法：
 *    1. import {getBatteryInfo} from '该文件的地址'
 *    2. 直接makePhoneCall(拨打的电话号码)
 */
const makePhoneCall = (phone) => {
  uni.makePhoneCall({
    phoneNumber: phone,
  });
};

/**
 * 设置缓存
 * @param {String} key 键名
 * @param {String} data 值
 */
export function setStorageSync(key, data) {
  uni.setStorageSync(key, data);
}

/**
 * 获取缓存
 * @param {String} key 键名
 */
export function getStorageSync(key) {
  return uni.getStorageSync(key);
}

/**
 * 删除缓存
 * @param {String} key 键名
 */
export function removeStorageSync(key) {
  return uni.removeStorageSync(key);
}

/**
 * 清空缓存
 * @param {String} key 键名
 */
export function clearStorageSync() {
  return uni.clearStorageSync();
}

/**
 * 页面跳转
 * @param {'navigateTo' | 'redirectTo' | 'reLaunch' | 'switchTab' | 'navigateBack' | number } url  转跳路径
 * @param {String} params 跳转时携带的参数
 * @param {String} type 转跳方式
 **/
export function useRouter(url, params = {}, type = "navigateTo") {
  try {
    if (Object.keys(params).length)
      url = `${url}?data=${encodeURIComponent(JSON.stringify(params))}`;
    if (type === "navigateBack") {
      uni[type]({ delta: url });
    } else {
      uni[type]({ url });
    }
  } catch (error) {
    console.error(error);
  }
}

/**
 * 预览图片
 * @param {Array} urls 图片链接
 */
export function previewImage(
  urls,
  itemList = ["发送给朋友", "保存图片", "收藏"]
) {
  uni.previewImage({
    urls,
    longPressActions: {
      itemList,
      fail: function (error) {
        console.error(error, "===previewImage");
      },
    },
  });
}

/**
 * 保存图片到本地
 * @param {String} filePath 图片临时路径
 **/
export function saveImage(filePath) {
  if (!filePath) return false;
  uni.saveImageToPhotosAlbum({
    filePath,
    success: (res) => {
      toast("图片保存成功", "success");
    },
    fail: (err) => {
      if (
        err.errMsg === "saveImageToPhotosAlbum:fail:auth denied" ||
        err.errMsg === "saveImageToPhotosAlbum:fail auth deny"
      ) {
        uni.showModal({
          title: "提示",
          content: "需要您授权保存相册",
          showCancel: false,
          success: (modalSuccess) => {
            uni.openSetting({
              success(settingdata) {
                if (settingdata.authSetting["scope.writePhotosAlbum"]) {
                  uni.showModal({
                    title: "提示",
                    content: "获取权限成功,再次点击图片即可保存",
                    showCancel: false,
                  });
                } else {
                  uni.showModal({
                    title: "提示",
                    content: "获取权限失败，将无法保存到相册哦~",
                    showCancel: false,
                  });
                }
              },
              fail(failData) {
                console.log("failData", failData);
              },
            });
          },
        });
      }
    },
  });
}

/**
 * 深拷贝
 * @param {Object} data
 **/
export const clone = (data) => JSON.parse(JSON.stringify(data));
/**
 * 获取平台名称
 * @return {string} 平台名称
 */
export function getPlatform() {
  let platform;
  switch (process.env.VUE_APP_PLATFORM) {
    case "app":
    case "app-plus":
      let n = uni.getSystemInfoSync().platform.toLowerCase();
      if (n === "ios") {
        platform = "ios";
      } else if (n === "android") {
        platform = "android";
      } else {
        platform = "app";
      }
      break;
    case "mp-weixin":
      platform = "wx";
      break;
    case "mp-alipay":
      platform = "alipay";
      break;
    case "mp-baidu":
      platform = "baidu";
      break;
    case "mp-qq":
      platform = "qq";
      break;
    case "mp-toutiao":
      platform = "toutiao";
      break;
    case "quickapp-webview":
      platform = "kuai";
      break;
  }

  return platform;
}

/**
 * 数组去重
 * @param {Array} array 数值
 * @retrun {Array} 数值
 */
export function arrayShuffle(array) {
  let i = array.length,
    t,
    j;
  while (i) {
    j = Math.floor(Math.random() * i--);
    t = array[i];
    array[i] = array[j];
    array[j] = t;
  }
  return array;
}

/**
 * 日期格式化
 * @param {Date} date 日期
 * @param {string} format 返回的日期格式
 * @retrun {string} 日期
 */
export function dateFormat(date, format = "YYYY-MM-DD HH:mm:ss") {
  const config = {
    YYYY: date.getFullYear(),
    MM: date.getMonth() + 1,
    DD: date.getDate(),
    HH: date.getHours(),
    mm: date.getMinutes(),
    ss: date.getSeconds(),
  };
  for (const key in config) {
    let value = config[key];
    if (value < 10) {
      value = "0" + value;
    }
    format = format.replace(key, value);
  }
  return format;
}

/**
 * base64转文件
 * @param {string} base64data base64
 * @param {Function} cb 回调
 */
export function base64ToSrc(base64data, cb) {
  const FILE_BASE_NAME = "tmp_base64src";
  const [, format, bodyData] =
    /data:image\/(\w+);base64,(.*)/.exec(base64data) || [];
  if (!format) {
    return new Error("格式错误");
  }

  // #ifdef MP-WEIXIN
  let filePath = `${wx.env.USER_DATA_PATH}/${FILE_BASE_NAME}.${format}`;
  // #endif
  // #ifdef MP-QQ
  let filePath = `${qq.env.USER_DATA_PATH}/${FILE_BASE_NAME}.${format}`;
  // #endif

  const buffer = uni.base64ToArrayBuffer(bodyData);
  uni.getFileSystemManager().writeFile({
    filePath,
    data: buffer,
    encoding: "binary",
    success() {
      cb && cb(filePath);
    },
  });
}

/**
 * base64解码
 * @param {string} str str
 * @param {string}
 */
export function encodeBase64(str) {
  return new Buffer.from(str).toString("base64");
}

/**
 * base64解码
 * @param {string} str str
 * @param {string}
 */
export function decodeBase64(str) {
  const commonContent = str.replace(/\s/g, "+");
  return new Buffer.from(commonContent, "base64").toString();
}

/**
 * 播放声音
 * @param {string} src 声音文件地址
 * @param {Boolean} loop 是否循环
 */
export function playSound(src, loop = false) {
  const innerAudioContext = uni.createInnerAudioContext();
  innerAudioContext.autoplay = true;
  innerAudioContext.loop = loop;
  innerAudioContext.src = src;
  innerAudioContext.onPlay(() => {});
  innerAudioContext.onError((res) => {});
}

/**
 * 生成订单ID
 * @param {string} prefix 订单前缀
 * @param {string} 订单ID
 */
export function createOrderSn(prefix = "") {
  return `${prefix}${this.randomString(10).toUpperCase()}${+new Date()}`;
}

/**
 * 图片转base64
 * @param {string} src 图片地址
 * @return {Promise} base64
 */
export function imageToBase64(src) {
  return new Promise((resolve, reject) => {
    uni.getImageInfo({
      src,
      success: (image) => {
        console.log(image);
        uni.getFileSystemManager().readFile({
          filePath: image.path,
          encoding: "base64",
          success: (e) => {
            return resolve(`data:image/jpeg;base64,${e.data}`);
          },
          fail: (e) => {
            return reject(null);
          },
        });
      },
    });
  });
}

/**
 * 随机范围内的数字
 * @param {number} start 起始数字
 * @param {number} end 起始数字
 * @return {number || null} 随机数
 */
export function randomByRange(start, end) {
  if (typeof start === "number" && typeof end === "number") {
    return start + Math.floor(Math.random() * (end - start));
  } else {
    console.error("参数必须为数字");
    return null;
  }
}

/**
 * 判断所给时间和今天的差值
 * @param {string} date 所给时间
 * @returns {string} 差值
 */

export function getDateDiff(date) {
  const inputDate = new Date(date.replace(/\//g, "-"));
  const today = new Date();
  today.setHours(0, 0, 0, 0);
  inputDate.setHours(0, 0, 0, 0);

  const timeDiff = inputDate - today;
  const oneDay = 24 * 60 * 60 * 1000;
  const daysDiff = Math.floor(timeDiff / oneDay);

  if (daysDiff === 0) {
    return "今天";
  } else if (daysDiff > 0) {
    return `${daysDiff}天后`;
  } else {
    return `${Math.abs(daysDiff)}天前`;
  }
}



/**
 * 将分钟转换为时间格式
 * @param {number} minutes 分钟
 * @returns {string} 时间格式
 */
export function minutesToTime(minutes) {
  const hours = Math.floor(minutes / 60);
  const mins = minutes % 60;
  const formattedHours = String(hours).padStart(2, '0');
  const formattedMins = String(mins).padStart(2, '0');
  return `${formattedHours}:${formattedMins}`;
}

/**
 * 格式化日期
 * @param {Date} date 日期
 * @returns {string} 格式化后的日期
 */
export function formatDate(date) {
  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}`;
}