/**
 *
 * @param variable -url上的变量明 最推荐
 */
const getUrlSearchParams = (variable: string) => {
  var query = window.location.search.substring(1);
  var vars = query.split("&");
  for (var i = 0; i < vars.length; i++) {
    var pair = vars[i].split("=");
    if (pair[0] == variable) { return pair[1] }
  }
  return (false);
}
//开发平台预览
let isMb = getUrlSearchParams('preview') === "mb" || /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
let isAndroid = /Android/i.test(navigator.userAgent)
const isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;

export var tools = {
  /**是否移动端 true:是  false: 否 */
  isMb: isMb,
  /**是否PC端 true:是  false: 否 */
  isPc: !isMb,
  /**是否苹果 true:是  false: 否 */
  isIOS,
  isAndroid: isAndroid,
  isComWx: /wxwork/i.test(navigator.userAgent),
  isMac: /macintosh|macintel/ig.test(navigator.userAgent.toLowerCase()),
  canUseSticky: CSS.supports('position', 'sticky'),
  canUseWebKitSticky: CSS.supports('position', '-webkit-sticky'),
  toArray<T>(any: T | T[]): T[] {
    if (!Array.isArray(any)) {
      return [any];
    } else {
      return any;
    }
  },
  //判断是否是微信浏览器的函数
  isWeiXin(): boolean {
    return window.navigator.userAgent.toLowerCase().indexOf('micromessenger') !== -1
  },
  //随机名称生成
  randonName(len?: number): string {
    var len: number | undefined = len || 32;
    var chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678';
    var maxPos = chars.length;
    var pwd = '';
    for (var i = 0; i < len; i++) {
      pwd += chars.charAt(Math.floor(Math.random() * maxPos));
    }
    return pwd
  },
  os: (() => {
    const ua = navigator.userAgent,
      os = {
        wechat: {
          version: ''
        },
        ios: false,
        iphone: false,
        ipad: false,
        android: false,
        version: ''
      };

    const funcs = [
      function () { //wechat
        let wechat = ua.match(/(MicroMessenger)\/([\d\.]+)/i);
        if (wechat) { //wechat
          os.wechat = {
            version: wechat[2].replace(/_/g, '.')
          };
        }
        return false;
      },
      function () { //android
        let android = ua.match(/(Android);?[\s\/]+([\d.]+)?/);
        if (android) {
          os.android = true;
          os.version = android[2];

          // os.isBadAndroid = !(/Chrome\/\d/.test(window.navigator.appVersion));
        }
        return os.android;
      },
      function () { //ios
        let iphone = ua.match(/(iPhone\sOS)\s([\d_]+)/);
        if (iphone) { //iphone
          os.ios = true;
          os.iphone = true;
          os.version = iphone[2].replace(/_/g, '.');
        } else {
          let ipad = ua.match(/(iPad).*OS\s([\d_]+)/);
          if (ipad) { //ipad
            os.ios = true;
            os.ipad = true;
            os.version = ipad[2].replace(/_/g, '.');
          }
        }
        return os.ios;
      }
    ];
    funcs.every(function (func) {
      return !func();
    });
    return os;
  })(),
  copy(text: string) {
    let input = document.createElement("textarea");
    input.style.cssText = 'position: absolute;top: -1px;height: 1px;width: 1px;';
    input.value = text;
    document.body.appendChild(input);
    input.select();
    document.execCommand("Copy");
    document.body.removeChild(input);
  },
  utf8ArrayToStr(array: Uint8Array) { // 数据流转化为字符串, 兼容汉字
    let out = "",
      i = 0,
      len = array.length,
      char1,
      char2,
      char3,
      char4;
    while (i < len) {
      char1 = array[i++];
      // 当单个字节时, 最大值 '01111111', 最小值 '00000000' 右移四位 07, 00
      // 当两个字节时, 最大值 '11011111', 最小值 '11000000' 右移四位 13, 12
      // 当三个字节时, 最大值 '11101111', 最小值 '11100000' 右移四位 14, 14
      if (char1 >> 4 <= 7) {
        out += String.fromCharCode(char1);
      } else if (char1 >> 4 == 12 || char1 >> 4 == 13) {
        char2 = array[i++];
        out += String.fromCharCode(((char1 & 0x1F) << 6) | (char2 & 0x3F));
      } else if (char1 >> 4 == 14) {
        char2 = array[i++];
        char3 = array[i++];
        char4 = ((char1 & 0x0F) << 12) | ((char2 & 0x3F) << 6);
        out += String.fromCharCode(char4 | ((char3 & 0x3F) << 0));
      }
    }
    return out;
  },
  //判断变量是否是对象
  isObject(obj: any): obj is Object {
    return Object.prototype.toString.call(obj) === "[object Object]";
  },
  isEmptyObject(obj: any): obj is {} {
    for (var key in obj) {
      if (obj.hasOwnProperty(key)) {
        return false;
      }
    }
    return true;
  },
  //判断变量是否是数组
  isArray<T = any>(arr: any): arr is Array<T> {
    return Object.prototype.toString.call(arr) === "[object Array]";
  },
  /**是否无效值 true:是 false:否 */
  isEmpty(variable: any) {
    var result = false;
    if (typeof variable === "string") {
      if (
        variable === "" ||
        variable === "undefined" ||
        // variable === "null" ||
        variable === "NaN" ||
        variable === "Infinity"
      ) {
        result = true;
      }
    } else if (typeof variable === "number") {
      if (isNaN(variable) || !isFinite(variable)) {
        result = false;
      }
    } else if (variable === null) {
      result = true;
    } else if (typeof variable === "undefined") {
      result = true;
    } else if (tools.isObject(variable)) {
      if (tools.isEmptyObject(variable)) {
        result = true;
      }
    } else if (tools.isArray(variable)) {
      if (variable.length === 0) {
        result = true;
      }
    }
    return result;
  },
  getGuid: (function () {
    let guid = 999;
    return function (prefix = 'guid-') {
      return `${prefix}${guid++}`
    }
  }()),
};
