export function debounce(func, wait, immediate) {
  let timeout, args, context, timestamp, result;

  const later = function() {
    // 据上一次触发时间间隔
    const last = +new Date() - timestamp;

    // 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait
    if (last < wait && last > 0) {
      timeout = setTimeout(later, wait - last);
    } else {
      timeout = null;
      // 如果设定为immediate===true，因为开始边界已经调用过了此处无需调用
      if (!immediate) {
        result = func.apply(context, args);
        if (!timeout) context = args = null;
      }
    }
  };

  return function(...args) {
    context = this;
    timestamp = +new Date();
    const callNow = immediate && !timeout;
    // 如果延时不存在，重新设定延时
    if (!timeout) timeout = setTimeout(later, wait);
    if (callNow) {
      result = func.apply(context, args);
      context = args = null;
    }

    return result;
  };
}

/**
 * @param {date} time 需要转换的时间
 * @param {String} fmt 需要转换的格式 如 yyyy-MM-dd、yyyy-MM-dd HH:mm:ss
 */
export function formatTime(time, fmt) {
  if (!time) return ''
  else {
    const date = new Date(time)
    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(fmt)) fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length))
    for (const k in o) {
      if (new RegExp('(' + k + ')').test(fmt)) {
        fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : ((
          '00' + o[k]).substr(('' + o[k]).length)))
      }
    }
    return fmt
  }
}


// 阻止用户F12查看网络
// export function check() {
//   function doCheck(a) {
//     (function() {}["constructor"]("debugger")()); //debugger
//     doCheck(++a);
//   }
//   try {
//     doCheck(0)
//   } catch(err) {
//     console.log(err)
//   }
// };


// !function(){
//   var _0x1cbb = ["tor", "struc", "call", "ger", "con", "bug", "de", "apply"];
//   setInterval(check, 2e3);
//   function check() {
//     function doCheck(_0x1834ff) {
//       if (('' + _0x1834ff / _0x1834ff)['length'] !== 0x1 || _0x1834ff % 0x14 === 0x0) {
//         (function() {return !![]}[
//           _0x1cbb[0x4] + _0x1cbb[0x1] + _0x1cbb[0x0]
//         ](
//           _0x1cbb[0x6] + _0x1cbb[0x5] + _0x1cbb[0x3]
//         )[_0x1cbb[0x2]]());
//       } else {
//         (function() {return ![]}[
//           _0x1cbb[0x4] + _0x1cbb[0x1] + _0x1cbb[0x0]
//         ](
//           _0x1cbb[0x6] + _0x1cbb[0x5] + _0x1cbb[0x3]
//         )[_0x1cbb[0x7]]());
//       }
//       doCheck(++_0x1834ff);
//     }
//     try {
//       doCheck(0)
//     } catch(err) { }
//   };
// }();
