
export const delay = ms => new Promise((resolve, reject) => setTimeout(resolve, ms))
// 数组去重
export function arrayUnique(arr) {
  arr.filter((element, index, arr) => {
    return arr.indexOf(element) === index
  })
}

// 数组去重，数组中值是对象
export function arrayUnique2(arr, name) {
  const hash = {}
  return arr.reduce(function(item, next) {
    hash[next[name]] ? '' : hash[next[name]] = true && item.push(next)
    return item
  }, [])
}

// 时间转时间戳
export function timeToStamp(time) {
  const date = new Date(time)
  return date.getTime()
}

// 数组的深度拷贝
export function arrDeepCopy(arr) {
  const newArr = []
  for (const prop in arr) newArr[prop] = typeof arr[prop] === 'object' ? arrDeepCopy(arr[prop]) : arr[prop]
  return newArr
}

// 对象的深度拷贝
export function objDeepCopy(obj) {
  const newObj = {}
  for (const prop in obj) newObj[prop] = typeof obj[prop] === 'object' ? objDeepCopy(obj[prop]) : obj[prop]
  return newObj
}

function zeroFill(i) {
  if (i >= 0 && i <= 9) {
    return '0' + i
  } else {
    return i
  }
}
// 获取当前时间
export function getNowTime() {
  const date = new Date()
  const month = zeroFill(date.getMonth() + 1)
  const day = zeroFill(date.getDate())
  const hour = zeroFill(date.getHours())
  const minute = zeroFill(date.getMinutes())
  const second = zeroFill(date.getSeconds())
  const time = date.getFullYear() + '-' + month + '-' + day + ' ' + hour + ':' + minute + ':' + second
  return time
}
export function getNowTime2() {
  const date = new Date()
  const month = zeroFill2(date.getMonth() + 1)
  const day = zeroFill(date.getDate())
  return date.getFullYear() + '-' + month + '-' + day
}
function zeroFill2(i) {
  if (i >= 0 && i <= 9) {
    if (i === 0) {
      return '01'
    } else {
      return '0' + i
    }
  } else {
    return i
  }
}

// 判断类型
export function type(target) {
  const ret = typeof (target)
  const template = {
    '[object Array]': 'array',
    '[object Object]': 'object',
    '[object String]': 'string - object',
    '[object Number]': 'Number - object',
    '[object Boolean]': 'Boolean - object'
  }
  if (target === null) {
    return 'null'
  }
  if (ret === 'object') {
    const str = Object.prototype.toString.call(target)
    return template[str]
  } else {
    return ret
  }
}

export function SectionToChinese(section) {
  const chnNumChar = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九']
  const chnUnitChar = ['', '十', '百', '千']
  let strIns = ''
  let chnStr = ''
  let unitPos = 0
  let zero = true
  while (section > 0) {
    const v = section % 10
    if (v === 0) {
      if (!zero) {
        zero = true
        chnStr = chnNumChar[v] + chnStr
      }
    } else {
      zero = false
      strIns = chnNumChar[v]
      strIns += chnUnitChar[unitPos]
      chnStr = strIns + chnStr
    }
    unitPos++
    section = Math.floor(section / 10)
  }
  return chnStr
}

export function sleep(time) {
  return new Promise(resolve => {
    setTimeout(resolve, time)
  })
}
export function formatTime(time) {
  const h = parseInt(time / 60 / 60 % 24)
  const m = parseInt(time / 60 % 60)
  const s = parseInt(time % 60)
  return h + 'H ' + m + 'M ' + s + 'S'
}

export function getDay2() {
  const days = []
  for (let i = 0; i <= 24 * 6; i += 24) {		// 今天加上前6天
    const dateItem = new Date(new Date().getTime() - i * 60 * 60 * 1000)	// 使用当天时间戳减去以前的时间毫秒（小时*分*秒*毫秒）
    // const y = dateItem.getFullYear()	// 获取年份
    let m = dateItem.getMonth() + 1	// 获取月份js月份从0开始，需要+1
    let d = dateItem.getDate()	// 获取日期
    m = addDate0(m)	// 给为单数的月份补零
    d = addDate0(d)	// 给为单数的日期补零
    const valueItem = m + '-' + d	// 组合
    days.push(valueItem)	// 添加至数组
  }
  return days
}

// 给日期加0
function addDate0(time) {
  if (time.toString().length === 1) {
    time = '0' + time.toString()
  }
  return time
}

// 表示全局唯一标识符(GUID).
function GetGuid(g) {
  const arr = [] // 存放32位数值的数组
  if (typeof (g) === 'string') { // 如果构造函数的参数为字符串
    InitByString(arr, g)
  } else {
    InitByOther(arr)
  }

  // 返回一个值，该值指示 Guid 的两个实例是否表示同一个值。
  this.Equals = function(o) {
    if (o && o.IsGuid) {
      return this.ToString() === o.ToString()
    } else {
      return false
    }
  }

  // Guid对象的标记
  this.IsGuid = function() {}

  // 返回 Guid 类的此实例值的 String 表示形式。
  this.ToString = function(format) {
    if (typeof (format) === 'string') {
      if (format === 'N' || format === 'D' || format === 'B' || format === 'P') {
        return ToStringWithFormat(arr, format)
      } else {
        return ToStringWithFormat(arr, 'D')
      }
    } else {
      return ToStringWithFormat(arr, 'D')
    }
  }

  // 由字符串加载
  function InitByString(arr, g) {
    g = g.replace(/[{()}\-]/g, '')
    g = g.toLowerCase()
    if (g.length !== 32 || g.search(/[^0-9,a-f]/i) !== -1) {
      InitByOther(arr)
    } else {
      for (let i = 0; i < g.length; i++) {
        arr.push(g[i])
      }
    }
  }

  // 由其他类型加载

  function InitByOther(arr) {
    let i = 32
    while (i--) {
      arr.push('0')
    }
  }

  /*

  根据所提供的格式说明符，返回此 Guid 实例值的 String 表示形式。

  N  32 位： xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

  D  由连字符分隔的 32 位数字 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

  B  括在大括号中、由连字符分隔的 32 位数字：{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}

  P  括在圆括号中、由连字符分隔的 32 位数字：(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)

  */

  function ToStringWithFormat(arr, format) {
    let str = ''
    switch (format) {
      case 'N':
        return arr.toString().replace(/,/g, '')
      case 'D':
        str = arr.slice(0, 8) + '-' + arr.slice(8, 12) + '-' + arr.slice(12, 16) + '-' + arr.slice(16, 20) + '-' + arr.slice(20, 32)
        str = str.replace(/,/g, '')
        return str
      case 'B':
        str = ToStringWithFormat(arr, 'D')
        str = '{' + str + '}'
        return str
      case 'P':
        str = ToStringWithFormat(arr, 'D')
        str = '(' + str + ')'
        return str
      default:
        return new Guid()
    }
  }
}

// Guid 类的默认实例，其值保证均为零。
GetGuid.Empty = new GetGuid()

/**
 * @param format N D B P
 * @returns {string}
 * @constructor
 */
export function Guid(format = 'D') {
  let g = ''
  let i = 32
  while (i--) {
    g += Math.floor(Math.random() * 16.0).toString(16)
  }
  return new GetGuid(g).ToString(format)
}
