const getDateString = date => {
  const year = date.getFullYear()
  const month = date.getMonth() + 1
  const day = date.getDate()
  const hour = date.getHours()
  const minute = date.getMinutes()
  const second = date.getSeconds()

  return [year, month, day].map(formatNumber).join('-')
}

const getTimeString = date => {
  const hour = date.getHours()
  const minute = date.getMinutes()

  return [hour, minute].map(formatNumber).join(':')
}

const formatTime = date => {
  const year = date.getFullYear()
  const month = date.getMonth() + 1
  const day = date.getDate()
  const hour = date.getHours()
  const minute = date.getMinutes()
  const second = date.getSeconds()

  return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')
}

const formatDate = date => {
  const year = date.getFullYear()%100
  const month = date.getMonth() + 1
  const day = date.getDate()
  const hour = date.getHours()
  const minute = date.getMinutes()

  return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute].map(formatNumber).join(':')
}

const formatNumber = n => {
  n = n.toString()
  return n[1] ? n : '0' + n
}


// 显示繁忙提示
var showBusy = text => wx.showToast({
  title: text,
  icon: 'loading',
  duration: 10000
})

// 显示成功提示
var showSuccess = text => wx.showToast({
  title: text,
  icon: 'success'
})

// 显示失败提示
var showModel = (title, content) => {
  wx.hideToast();

  wx.showModal({
    title,
    content: JSON.stringify(content),
    showCancel: false
  })
}

// ArrayBuffer转16进度字符串示例
const ab2hex = buffer => {
  var hexArr = Array.prototype.map.call(
    new Uint8Array(buffer),
    function(bit) {
      return ('00' + bit.toString(16)).slice(-2)
    }
  )
  return hexArr.join('');
}

function isPrime(n) {
  if (isNaN(n) || !isFinite(n) || n % 1 || n < 2) return false;
  if (n == leastFactor(n)) return true;
  return false;
}

// leastFactor(n)
// returns the smallest prime that divides n
//     NaN if n is NaN or Infinity
//      0  if n=0
//      1  if n=1, n=-1, or n is not an integer

function leastFactor(n) {
  if (isNaN(n) || !isFinite(n)) return NaN;
  if (n == 0) return 0;
  if (n % 1 || n * n < 2) return 1;
  if (n % 2 == 0) return 2;
  if (n % 3 == 0) return 3;
  if (n % 5 == 0) return 5;
  var m = Math.sqrt(n);
  for (var i = 7; i <= m; i += 30) {
    if (n % i == 0) return i;
    if (n % (i + 4) == 0) return i + 4;
    if (n % (i + 6) == 0) return i + 6;
    if (n % (i + 10) == 0) return i + 10;
    if (n % (i + 12) == 0) return i + 12;
    if (n % (i + 16) == 0) return i + 16;
    if (n % (i + 22) == 0) return i + 22;
    if (n % (i + 24) == 0) return i + 24;
  }
  return n;
}

function randomPrime() {
  //取一个8位数的随机数
  var random = Math.floor(Math.random() * 90000000 + 10000000);
  if (isPrime(random)) return random;

  //取rondom最近的一个素数
  var index = 0
  var prime = 10000019;
  while (true) {
    index++;

    if (isPrime(random + index)) {
      prime = random + index;
      break;
    }

    if (isPrime(random - index)) {
      prime = random - index;
      break;
    }
  }
  return prime;
}

function randomPrime6() {
  //取一个6位数的随机数
  var random = Math.floor(Math.random() * 900000 + 100000);
  if (isPrime(random)) return random;

  //取rondom最近的一个素数
  var index = 0
  var prime = 100003;
  while (true) {
    index++;

    if (isPrime(random + index)) {
      prime = random + index;
      break;
    }

    if (isPrime(random - index)) {
      prime = random - index;
      break;
    }
  }
  return prime;
}

function randomN() {
  //return 5
  //取一个4~15之间的随机数
  var random = Math.floor(Math.random() * 15 + 4);
  if (isPrime(random)) return random;

  //取rondom最近的一个素数
  var index = 0
  var prime = 3;
  while (true) {
    index++;

    if (isPrime(random + index)) {
      prime = random + index;
      break;
    }

    if (isPrime(random - index)) {
      prime = random - index;
      break;
    }
  }
  return prime;
}

// Convert a hex string to a byte array
const hexToBytes = hex => {
  for (var bytes = [], c = 0; c < hex.length; c += 2)
    bytes.push(parseInt(hex.substr(c, 2), 16));
  return bytes;
}

// Convert a byte array to a hex string
const bytesToHex = bytes => {
  for (var hex = [], i = 0; i < bytes.length; i++) {
    hex.push((bytes[i] >>> 4).toString(16));
    hex.push((bytes[i] & 0xF).toString(16));
  }
  return hex.join("");
}

const macToInt = mac => {
  var macNew = mac.replace(/:/g, '').substring(4)
  //console.log('macNew', macNew)
  var high = parseInt(macNew.substr(0, 4), 16)
  //console.log('high', high)
  var low = parseInt(macNew.substr(4, 4), 16)
  //console.log('low', low)

  return (high << 16) | low
}

const hexToInt = hex => {
  var high = parseInt(hex.substr(0, 4), 16)
  //console.log('high', high)
  var low = parseInt(hex.substr(4, 4), 16)
  //console.log('low', low)

  return (high << 16) | low
}

const getLockModel = name => {
  if (name == undefined || name == null) return 0
  if (name.length == 9) {
    return 1
  } else {
    if (name.indexOf("WSL_A") == 0) {
      return 1 + parseInt(name.substr(5, 6))
    } else if (name.indexOf("WSL_H") == 0) {
      return 10 + parseInt(name.substr(5, 6))
    } else if (name.indexOf("WSL_B") == 0) {
      return 21 + parseInt(name.substr(5, 6))
    } else if (name.indexOf("WSL_N") == 0) {
      return 30 + parseInt(name.substr(5, 6))
    } else if (name.indexOf("WSL_M") == 0) {
      return 40 + parseInt(name.substr(5, 6))
    } else if (name.indexOf("WSL_U") == 0) {
      return 50 + parseInt(name.substr(5, 6))
    } else if (name.indexOf("WSL_J") == 0) {
      return 60 + parseInt(name.substr(5, 6))
    } else if (name.indexOf("WSL_F") == 0) {
      return 70 + parseInt(name.substr(5, 6))
    } else if (name.indexOf("WSL_C") == 0) {
      return 80 + parseInt(name.substr(5, 6))
    } else if (name.indexOf("WSL_O") == 0) {
      return 90 + parseInt(name.substr(5, 6))
    } else if (name.indexOf("WSL_D") == 0) {
      return 100 + parseInt(name.substr(5, 6))
    } else if (name.indexOf("WSJ_Q") == 0) {
      return 10000 + parseInt(name.substr(5, 6))
    } else {
      return 0
    }
  }
}

const isNbLock = model => {
  if (model > 30 && model <= 49) {
    return true
  } else {
    return false
  }
}

const isUxLock = model => {
  if (model > 30 && model <= 59) {
    return true
  } else {
    return false
  }
}

const isFxLock = model => {
  if (model > 70 && model <= 79) {
    return true
  } else {
    return false
  }
}

const getLockType = model => {
  if (model > 0 && model <= 9) {
    return '蓝牙密码锁'
  } else if (model > 10 && model <= 19) {
    return '家庭锁系列'
  } else if (model > 20 && model <= 29) {
    return '酒店密码锁'
  } else if (model > 30 && model <= 49 || model > 100 && model <= 109) {
    return '蓝牙NB锁'
  } else if (model > 50 && model <= 59 || model > 90 && model <= 99) {
    return '蓝牙密码锁'
  } else if (model > 60 && model <= 69) {
    return '蓝牙NB机柜锁'
  } else if (model > 70 && model <= 79) {
    return '蓝牙指纹锁'
  } else if (model > 80 && model <= 89) {
    return 'NB指纹锁'
  } else if (model > 10000 && model <= 10009) {
    return '取电开关'
  }
}

const getLockName = (mac, model) => {
  var name = mac.replace(/:/g, '_').slice(mac.length - 5, mac.length)
  if (model == 1) {
    return `WSL_${name}`
  } else if (model > 1 && model <= 9) {
    return `WSL_A${model % 10-1}_${name}`
  } else if (model > 20 && model <= 29) {
    return `WSL_B${model % 10-1}_${name}`
  } else if (model > 10 && model <= 19) {
    return `WSL_H${model % 10}_${name}`
  } else if (model > 30 && model <= 39) {
    return `WSL_N${model % 10}_${name}`
  } else if (model > 40 && model <= 49) {
    return `WSL_M${model % 10}_${name}`
  } else if (model > 50 && model <= 59) {
    return `WSL_U${model % 10}_${name}`
  } else if (model > 60 && model <= 69) {
    return `WSL_J${model % 10}_${name}`
  } else if (model > 70 && model <= 79) {
    return `WSL_F${model % 10}_${name}`
  } else if (model > 80 && model <= 89) {
    return `WSL_C${model % 10}_${name}`
  } else if (model > 90 && model <= 99) {
    return `WSL_O${model % 10}_${name}`
  } else if (model > 100 && model <= 109) {
    return `WSL_D${model % 10}_${name}`
  } else if (model > 10000 && model <= 10009) {
    return `WSJ_Q${model % 10}_${name}`
  }
}

//得到标准时区的时间的函数
function getLocalTime(i) {
  //参数i为时区值数字，比如北京为东八区则输进8,西5输入-5
  if (typeof i !== 'number') return;
  var d = new Date();
  //得到1970年一月一日到现在的秒数
  var len = d.getTime();
  //本地时间与GMT时间的时间偏移差
  var offset = d.getTimezoneOffset() * 60000;
  //得到现在的格林尼治时间
  var utcTime = len + offset;
  return new Date(utcTime + 3600000 * i);
}

//得到标准时区的时间的函数
function getLocalTimeByZone(d, i) {
  //参数i为时区值数字，比如北京为东八区则输进8,西5输入-5
  if (typeof i !== 'number') return;
  //var d = new Date();
  //得到1970年一月一日到现在的秒数
  var len = d.getTime();
  //本地时间与GMT时间的时间偏移差
  var offset = d.getTimezoneOffset() * 60000;
  //得到现在的格林尼治时间
  var utcTime = len + offset;
  return new Date(utcTime + 3600000 * i);
}

module.exports = {
  getDateString,
  getTimeString,
  formatTime,
  formatDate,
  showBusy,
  showSuccess,
  showModel,
  isPrime,
  randomPrime,
  randomPrime6,
  randomN,
  ab2hex,
  bytesToHex,
  hexToBytes,
  macToInt,
  hexToInt,
  getLockModel,
  getLockType,
  getLockName,
  isUxLock,
  isNbLock,
  isFxLock,
  getLocalTime
}