/*
 * @Author: Mm
 * @Date: 2025-05-07 17:08:30
 * @LastEditors: Mm
 * @LastEditTime: 2025-05-12 10:12:54
 * 不写bug的程序员不是一个好程序员!
 */

const $isNotEmpty = function (obj) {
  return obj !== undefined && obj !== null && obj !== '' && obj !== 'null';
};
/**
 * 去抖动函数
 * @param call 回调函数
 * @param cycle 抖动时长
 * @returns {(function(...[*]): void)|*}
 */
const $debounce = function (call, cycle=1000) {
  var timer = null; // 创建一个用来存放定时器的变量
  let func = call
  return function (...args) {
    clearTimeout(timer); //只要触发就清除
    timer = setTimeout(() => {
      func.apply(this, args);
    }, cycle);
  };
}
/**
 * 对对象进行序列化深拷贝
 * @param obj
 * @returns {any}
 */
const $deepCopy = function (obj) {
  return JSON.parse(JSON.stringify(obj || '{}'))
}

//判断是否设备为移动端
const $isMobile = function () {
  return window.screen.width < 450;
};
/**
 * 解析资源地址
 * @param url 资源url
 * @returns {string}
 */
const $getRes = function (url) {
  const reg = /^(http:|https:).*/gi;
  // return reg.test(url) ? url : globalProps.BASE_URL + url;
  return reg.test(url) ? url :  url;
};
export default{
  install:(app)=>{
    app.config.globalProperties.$isNotEmpty = $isNotEmpty;
    app.config.globalProperties.$debounce = $debounce;
    app.config.globalProperties.$deepCopy = $deepCopy;
    app.config.globalProperties.$isMobile = $isMobile;
    app.config.globalProperties.$getRes = $getRes;

    /**
     * 移除一个数组值
     * @param value 需要移除得值
     * @returns {number}
     */
    Array.prototype.remove = function (value) {
      let index = this.indexOf(value);
      if (index > -1) {
        this.splice(index, 1);
      }
      return index;
    };

    /**
     * 根据key 移除数组里面一个指定值的对象，匹配唯一key
     * @param key key
     * @param val key对应的值
     * @returns {number}
     */
    Array.prototype.removeByKey = function (key, val) {
      let index = this.findIndex((value) => value[key] === val);
      if (index > -1) {
        this.splice(index, 1);
      }
      return index;
    };

    //对象数组转map
    Array.prototype.toMap = function (key) {
      let map = new Map();
      this.forEach((v) => map.set(v[key], v));
      return map;
    };
  }
  
}
