/**
 * 首字母小写
 * @param {string} str 
 * @returns {string}
 */
function toLowerFirst(str) {
  return str.replace(str[0], str[0].toLowerCase());
}

export default {
  /**
   * 从 topic 中提取 eventName 
   * @param {string} topic 以 on 或 off 开头的字符串
   * @example
   * // returns 'eventName'
   * utils.getEventFromTopic('onEventName');
   * @returns {string} 返回去除 topic 开头的 on 或 off 后并将首字母小写的内容
   */
  getEventNameFromTopic(topic) {
    if (!topic || typeof topic !== 'string') return topic;
    const rmOnStr = topic.replace(/^on/, '');
    if (rmOnStr && rmOnStr !== topic) return toLowerFirst(rmOnStr);

    const rmOffStr = topic.replace(/^off/, '');
    if (rmOffStr && rmOffStr !== topic) return toLowerFirst(rmOffStr);

    if (!rmOnStr && !rmOffStr) return ''
    return toLowerFirst(topic);
  },

  /**
   * webSocket信息转换
   * 特殊字符串转换
   * @param {any} message 
   */
  getWSMessage(message) {
    if (typeof message === 'string' || message instanceof ArrayBuffer) {
      return message;
    }
    if (
      message instanceof Uint8Array ||
      message instanceof Int8Array ||
      message instanceof Uint16Array ||
      message instanceof Int16Array ||
      message instanceof Uint32Array ||
      message instanceof Int32Array
    ) {
      return message.buffer.slice(message.byteOffset, message.byteOffset + message.byteLength);
    }
  },

  /**
   * 生产事件 type
   * 提取传参中的字符串类型的数据作为唯一key，只取一层，过滤callback
   * @param {strig} moduleName 
   * @param {strig} topic 
   * @param {any} [params] 
   * @returns {string}
   */
  genEventType(moduleName, topic, params) {
    if (params && typeof params === 'object') {
      try {
        return Object.keys(params).reduce((keys, key) => {
          if (typeof params[key] === 'string' && key !== 'callback')  {
            keys.push(params[key])
          }
          return keys
        }, [moduleName, topic]).join('_')
      } catch (_) {
        //
      }
    }
    return `${moduleName}_${topic}`
  }
}