const Utils = {
  toBase64(buffer) {
    let binary = '';
    let bytes = new Uint8Array(buffer);
    let len = bytes.byteLength;
    for (let i = 0; i < len; i++) {
      binary += String.fromCharCode(bytes[i]);
    }
    return window.btoa(binary);
  },
  delayTime: function (time) {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve();
      }, time);
    });
  },
  mergeArrayBuffers(buffers) {
    if(buffers.length == 1) return buffers[0]
    const byteLength = buffers.reduce((prev , cur) => prev + cur.byteLength , 0)
    const mergeBuffer = new ArrayBuffer(byteLength)
    const mergeView = new Uint8Array(mergeBuffer)
    let offset = 0
    for(let i = 0 ; i < buffers.length ; i++) {
      mergeView.set(new Uint8Array(buffers[i]), offset)
      offset += buffers[i].byteLength
    }
    return mergeBuffer
  },
  getMediaCodeToMsg(code) {
    if (/device not found/.test(code)) {
      return '没有发现录音设备';
    } else if (/Permission denied/.test(code)) {
      return '录音权限被禁止';
    }
    return code;
  },
  async isCanableRecorder(delayTime = 1500) {
    if (!(navigator && navigator.mediaDevices && navigator.mediaDevices.getUserMedia))
      return {
        isSuccess: false,
        msg: '没有发现音频设备',
      };
    try {
      const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
      stream.getTracks().map((track) => {
        track.enabled = false;
        track.stop();
      });
      await this.delayTime(delayTime);
      return {
        isSuccess: true,
      };
    } catch (e) {
      return {
        isSuccess: false,
        msg: this.getMediaCodeToMsg(e?.toString()),
      };
    }
  },
  GetBytesLength: function (str) {
    let realLength = 0;
    if (!str) return realLength;
    for (let i = 0; i < str.length; i++) {
      const charCode = str.charCodeAt(i);
      if (charCode >= 0 && charCode <= 128) realLength += 1;
      else realLength += 2;
    }
    return realLength;
  },
  findMenus({ name }) {
    const result = {
      widgets: [],
    }
    window.globalConfig.widgets.map(widget => this._findMenus({ widget, name, result }))
    return result
  },
  _findMenus({ widget, name, result }) {
    if (widget.hideInMenu) return
    if (name instanceof RegExp) {
      const isPattern = name.test(widget.label)
      if (isPattern) {
        result.widgets.push(widget)
      }
    } else if (name == widget.label) {
      result.widgets.push(widget)
    }
    if (widget.widgets && Array.isArray(widget.widgets)) {
      return widget.widgets.map(widget => this._findMenus({ widget, name, result }))
    }
  },
  openMenu({ widget = {}, url }) {
    if (!((widget.url && widget.product) || url)) return
    const _url = url || `${widget.product}/${widget.url}`
    window.history.pushState(null, '', `/civbase/${_url}`);
  },
  chineseToNumber(str) {
    if (str.length == 1) {
      return this._chineseToNumber(str[0])
    } else if (str.length == 3) {
      const unit = this._chineseToNumber(str[0])
      const decade = this._chineseToNumber(str[1])
      const threed = this._chineseToNumber(str[2])
      return decade * unit + threed
    }
    return 0
  },
  _chineseToNumber(str) {
    switch (str) {
      case "一":
        return 1
      case "二":
        return 2
      case "三":
        return 3
      case "四":
        return 4
      case "五":
        return 5
      case "六":
        return 6
      case "七":
        return 7
      case "八":
        return 8
      case "九":
        return 9
      case "十":
        return 10
    }
  }
};

export default Utils;