/**
 * 工具类
 */
import Config from "./config";

const LOG_SHOW = Config.get('bluetoothConsole') //是否开启蓝牙调试


/**
 * 对象转URL
 * @param {object} obj
 */
export const urlEncode = (obj = {}) => {
  const result = []
  for (const key in obj) {
    const item = obj[key]
    if (!item) {
      continue
    }
    if (isArray(item)) {
      item.forEach(val => {
        result.push(key + '=' + val)
      })
    } else {
      result.push(key + '=' + item)
    }
  }
  return result.join('&')
}

/**
 * 遍历对象
 */
export const objForEach = (obj, callback) => {
  Object.keys(obj).forEach((key) => {
    callback(obj[key], key)
  });
}

/**
 * 是否在数组内
 */
export const inArray = (search, array) => {
  for (var i in array) {
    if (array[i] == search) return true
  }
  return false
}

/**
 * 判断是否为空对象
 * @param {*} object 源对象
 */
export const isEmptyObject = (object) => {
  return Object.keys(object).length === 0
}

/**
 * 判断是否为对象
 * @param {*} object
 */
export const isObject = (object) => {
  return Object.prototype.toString.call(object) === '[object Object]'
}

/**
 * 判断是否为数组
 * @param {*} array
 */
export const isArray = (array) => {
  return Object.prototype.toString.call(array) === '[object Array]'
}

/**
 * 判断是否为空
 * @param {*} object 源对象
 */
export const isEmpty = (value) => {
  if (isArray(value)) {
    return value.length === 0
  }
  if (isObject(value)) {
    return isEmptyObject(value)
  }
  return !value
}

/**
 * 对象深拷贝
 * @param {*} obj 源对象
 */
export const cloneObj = (obj) => {
  let newObj = obj.constructor === Array ? [] : {};
  if (typeof obj !== 'object') {
    return;
  }
  for (let i in obj) {
    newObj[i] = typeof obj[i] === 'object' ? cloneObj(obj[i]) : obj[i];
  }
  return newObj
}

/**
 * 数组交集
 * @param {Array} 数组1
 * @param {Array} 数组2
 * @return {Array}
 */
export const arrayIntersect = (array1, array2) => {
  return array1.filter(val => array2.indexOf(val) > -1)
}


export const arrayFindData = (data, value, keyName, itemName = null, label = 1) => {
  let info = [];
  let itemIsArray = false
  if (isEmpty(data)) return info
  if (data && isArray(data[0][keyName])) itemIsArray = true
  let valueIsArray = false
  if (isArray(value)) valueIsArray = true
  data.some((item, index) => {
    if (
      (!itemIsArray && !valueIsArray && value == item[keyName]) ||
      (itemIsArray && !valueIsArray && inArray(value, item[keyName])) ||
      (!itemIsArray && valueIsArray && inArray(item[keyName], value))
    ) {
      info.push({
        index: index,
        value: item
      })
      return info;
    } else if (label - 1 > 0 && item[itemName] instanceof Array) {
      let aaa = arrayFindData(item[itemName], value, keyName, itemName, label - 1)
      if (aaa.length > 0) {
        info.push({
          index: index,
          value: item
        })
        info.push(...aaa);
        return info;
      }
    }
  });
  return info;
}


export const array_column = (arr = [], column, indexKey = null) => {
  let data = {};
  if (column && indexKey) {
    arr.forEach((item) => {
      data[item[indexKey]] = item[column]
    })
  } else if (column && !indexKey) {
    data = []
    arr.forEach((item) => {
      data.push(item[column])
    })
  } else {
    arr.forEach((item) => {
      data[item[indexKey]] = item
    })
  }
  return data
}


export const secondsConvert = (seconds) => {
  if (!seconds) return '00:00'
  return formatZero(parseInt(seconds / 60), 2) + ':' + formatZero(seconds % 60, 2)
}

export const msConvert = (seconds) => {
  if (!seconds) return "00′00"
  return formatZero(parseInt(seconds / 1000), 2) + "′" + formatZero(seconds % 1000, 3)
}


/**
 * 数字不够x位，前面补0
 * @param {*} num 数字
 * @param {*} len 补零长度
 * @returns  0001
 */
export function formatZero(num, len) {
  if (String(num).length > len) {
    return num;
  }
  return (Array(len).join(0) + num).slice(-len)
}

/**
 * 字符串按指定长度切割
 * @param str
 * @param size
 * @returns {*[]}
 */
export function sliceChunk(str, size = 2) {
  const reg = new RegExp(`.{1,${size}}`, 'g');
  return str.match(reg);
}


export const sleep = (interval) => {
  return new Promise((resolve) => {
      setTimeout(resolve, interval);
    }
  )
}


/**
 * 对微信接口的promise封装
 * @param {function} fn
 * @param {object} args
 */
export const promisify = (fn, args) => {
  return new Promise((resolve, reject) => {
    fn({
      ...(args || {}),
      success: (res) => resolve(res),
      fail: (err) => reject(err),
    });
  });
}

export const logs = (...arr) => {
  LOG_SHOW && console.info('调试打印', ...arr)
}

/**
 * 格式化数字
 * @param value
 * @param detault
 * @param maxLenght
 * @param decimalLength
 * @returns {number|string}
 */
export const formatterConvert = (value, detault = '', maxLenght = 5, decimalLength = 0, isMinus = false) => {
  if (value[0] == '-') {
    value = value.slice(1)
  }
  value = value.toString()
  let result = value.split(".")
  if (value.charAt(value.length - 1) === '.' && decimalLength > 0) {
    let num = Math.abs(result[0])
    return num + '.' || detault
  }
  if (result.length > 2) result = result.slice(0, 2)
  if (result[0].length > maxLenght) {
    result[0] = result[0].slice(0, maxLenght)
  }
  if (result[0].length > 0) result[0] = Math.abs(result[0])

  if (decimalLength > 0) {
    if (result[1]) result[1] = result[1].slice(0, decimalLength)
  } else {
    if (result[1]) result = result.slice(1, 1)
  }
  let res = result.join('.') || detault
  return res
}


/**
 * 获取结果值在数组内容
 * @param data
 * @param value
 * @param keyName
 * @param itemName
 * @param label
 * @returns {Promise<*>}
 */
export const findArrayInfo = async (data, value, keyName, itemName = null, label = 1) => {
  let info = await arrayFindData(data, value, keyName, itemName, label)
  return Promise.resolve(info);
}

/**
 * 获取结果值在数组中的下标
 * @param arr
 * @param val
 * @param itemName
 */
export const findArrayIndex = async (arr, val, itemName) => {
  if (!arr.length) return -1;
  let resultIndex = arr.findIndex(function (value, index, arr) {
    let values = itemName ? value[itemName] : value;
    return values == val;
  })
  return resultIndex
}


export const array_chunk = (arr, size) => {
  let newArr = []
  for (let i = 0, len = arr.length; i < len; i += size) {
    newArr.push(arr.slice(i, i + size));
  }
  return newArr
}


export const arraySearchAndSort = async (list, keyword = '', keyName = 'name') => {
  list.forEach((item) => {
    item.arraySearchName = item[keyName]
    item.arraySearchKey = 0
    if (!keyword) return true
    let reg = item[keyName].match(RegExp(`${keyword}`));
    item.arraySearchKey = reg ? reg.length : 0
    if (item.arraySearchKey > 0) {
      item.arraySearchName = item.arraySearchName.replace(new RegExp(`(${keyword})`, 'g'), `${keyword}`)
    }
  })
  return list
}


export const strToObject = (str) => {
  let arr = str.split(";");
  let data = {}
  arr.forEach((item) => {
    if (!item) return true
    let itemArr = item.split(':')
    data[itemArr[0]] = itemArr[1]
  })
  return data
}


export const objectToStr = (arr) => {
  let data = []
  Object.keys(arr).forEach((item) => {
    data.push(`${item}:${arr[item]}`)
  })
  return data.join(';') + ';'
}


export const countdownTimer = (callback, duration = 5) => {
  let timer = setInterval(function () {
    duration--;
    if (duration < 0) {
      clearInterval(timer);
    }
  }, 1000);
}

/**
 *
 * */
export const pxTorpx = (px) => {
  let deviceWidth = uni.getSystemInfoSync().windowWidth; //获取设备屏幕宽度
  let rpx = (750 / deviceWidth) * Number(px)
  return Math.floor(rpx);
}


export const getAllMethods = (obj) => {
  let methods = new Set();
  let currentObj = obj;

  do {
    Object.getOwnPropertyNames(currentObj).forEach(prop => {
      if (typeof obj[prop] === 'function') {
        methods.add(prop);
      }
    });
    currentObj = Object.getPrototypeOf(currentObj);
  } while (currentObj && currentObj !== Object.prototype); // 避免添加Object的默认方法

  return Array.from(methods).filter(method => method !== 'constructor');
}
