/**
 * 该文件主要放工具类的函数
 */

import axios from 'axios' // 删除附件用

/**
 *获取当前时间:  YYYY-MM-DD hh:mm:ss
 */
export function getNowDateTime() {
  const myDate = new Date()
  myDate.getYear() // 获取当前年份(2位)
  const YY = myDate.getFullYear() // 获取完整的年份(4位,1970-????)
  let MM = myDate.getMonth() + 1 // 获取当前月份(0-11,0代表1月)
  MM = MM > 9 ? MM : ('0' + MM)
  let DD = myDate.getDate() // 获取当前日(1-31)
  DD = DD > 9 ? DD : ('0' + DD)
  let hh = myDate.getHours()
  hh = hh > 9 ? hh : ('0' + hh)
  let mm = myDate.getMinutes()
  mm = mm > 9 ? mm : ('0' + mm)
  let ss = myDate.getSeconds()
  ss = ss > 9 ? ss : ('0' + ss)
  return YY + '-' + MM + '-' + DD + ' ' + hh + ':' + mm + ':' + ss
}

/**
 *获取当前日期:  YYYY-MM-DD
 */
export function getNowDate() {
  const myDate = new Date()
  myDate.getYear() // 获取当前年份(2位)
  const YY = myDate.getFullYear() // 获取完整的年份(4位,1970-????)
  let MM = myDate.getMonth() + 1 // 获取当前月份(0-11,0代表1月)
  MM = MM > 9 ? MM : ('0' + MM)
  let DD = myDate.getDate() // 获取当前日(1-31)
  DD = DD > 9 ? DD : ('0' + DD)
  return YY + '-' + MM + '-' + DD
}

/**
 * 获取多长时间之前的日期： YYYY-MM-DD
 * pdate int 如一个月前 传 3600 * 1000 * 24 * 30
 */
export function getPreDate(pdate = 3600 * 1000 * 24 * 30) {
  const start = new Date()
  start.setTime(start.getTime() - pdate)
  start.getYear() // 获取当前年份(2位)
  const YY = start.getFullYear() // 获取完整的年份(4位,1970-????)
  let MM = start.getMonth() + 1 // 获取当前月份(0-11,0代表1月)
  MM = MM > 9 ? MM : ('0' + MM)
  let DD = start.getDate() // 获取当前日(1-31)
  DD = DD > 9 ? DD : ('0' + DD)
  return YY + '-' + MM + '-' + DD
}

/**
 *获取当前月的一号
 */
export function getFirstDayInCurrentMonth() {
  const myDate = new Date()
  myDate.getYear() // 获取当前年份(2位)
  const YY = myDate.getFullYear() // 获取完整的年份(4位,1970-????)
  let MM = myDate.getMonth() + 1 // 获取当前月份(0-11,0代表1月)
  MM = MM > 9 ? MM : ('0' + MM)
  let DD = myDate.getDate() // 获取当前日(1-31)
  DD = DD > 9 ? DD : ('0' + DD)
  return YY + '-' + MM + '-01'
}

/**
 * 超期变红
 * 比较这样的日期（2018-11-14）
 * 超期返回 'red'
 */
export function endtimeFilter(status) {
  const d = status.replace(/-/g, '/')
  let curDate = new Date().getFullYear() + '-' + (new Date().getMonth() + 1) + '-' + new Date().getDate()
  curDate = curDate.replace(/-/g, '/')
  let str = ''
  if (Date.parse(d) >= Date.parse(curDate)) {
    str = ''
  } else {
    str = 'red'
  }
  return str
}

/**
 * 将时间戳 转换成 日期格式 (2018-07-20 11:38:34)
 * @timestamp 时间戳为10位需*1000，时间戳为13位的话不需乘1000
 * 注意：如果是Unix时间戳记得乘以1000。比如：PHP函数time()获得的时间戳就要乘以1000。
 */
export function timestampToTime0(timestamp) {
  if (Number(timestamp) <= 0) {
    return '-'
  }
  if (('' + timestamp).length === 10) {
    timestamp = parseInt(timestamp) * 1000
  }
  const date = new Date(timestamp)
  const Y = date.getFullYear() + '-'
  const M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-'
  const D = (date.getDate() < 10 ? '0' + (date.getDate()) : date.getDate()) + ' '
  const h = (date.getHours() < 10 ? '0' + (date.getHours()) : date.getHours()) + ':'
  const m = (date.getMinutes() < 10 ? '0' + (date.getMinutes()) : date.getMinutes()) + ':'
  const s = (date.getSeconds() < 10 ? '0' + (date.getSeconds()) : date.getSeconds())
  return Y + M + D + h + m + s
}

// 将时间戳 转换成 日期格式 (2018-07-20 11:38:34 星期一) 格式可以自定义
export function timestampToTime(time, cFormat) {
  if (arguments.length === 0) {
    return null
  }
  if (Number(time) <= 0) {
    return '-'
  }
  const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'
  let date
  if (typeof time === 'object') {
    date = time
  } else {
    if (('' + time).length === 10) time = parseInt(time) * 1000
    date = new Date(time)
  }
  const formatObj = {
    y: date.getFullYear(),
    m: date.getMonth() + 1,
    d: date.getDate(),
    h: date.getHours(),
    i: date.getMinutes(),
    s: date.getSeconds(),
    a: date.getDay()
  }
  const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
    let value = formatObj[key]
    if (key === 'a') return ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日'][value - 1]
    if (result.length > 0 && value < 10) {
      value = '0' + value
    }
    return value || 0
  })
  return time_str
}

/**
 * 将 秒 转换成 天时分秒
 */
export function secondToDuring(ss) {
  let days = parseInt(ss / (60 * 60 * 24))
  let hours = parseInt((ss % (60 * 60 * 24)) / (60 * 60))
  let minutes = parseInt((ss % (60 * 60)) / (60))
  let seconds = ss % 60
  days = days > 0 ? (days + '天') : ''
  hours = hours > 0 ? (hours + '小时') : ''
  minutes = minutes > 0 ? (minutes + '分') : ''
  seconds = seconds >= 0 ? (seconds + '秒') : ''
  return days + hours + minutes + seconds
}

/**
 * 计算 两个时间的差 值
 * time1 > time2
 */
export function compearTime(time1, time2) {
  if (time1 && time2) {
    time1 = time1.replace(/-/g, '/')
    time2 = time2.replace(/-/g, '/')
    const ntime = Date.parse(time1) - Date.parse(time2)
    return secondToDuring(ntime / 1000)
  } else {
    return '-'
  }
}

export function formatTime(time, option) {
  time = +time * 1000
  const d = new Date(time)
  const now = Date.now()

  const diff = (now - d) / 1000

  if (diff < 30) {
    return '刚刚'
  } else if (diff < 3600) { // less 1 hour
    return Math.ceil(diff / 60) + '分钟前'
  } else if (diff < 3600 * 24) {
    return Math.ceil(diff / 3600) + '小时前'
  } else if (diff < 3600 * 24 * 2) {
    return '1天前'
  }
  if (option) {
    return formatTime(time, option)
  } else {
    return d.getMonth() + 1 + '月' + d.getDate() + '日' + d.getHours() + '时' + d.getMinutes() + '分'
  }
}

// 格式化 日期选择器的 带快捷选项
export const pickerOptions = {
  shortcuts: [{
    text: '最近一周',
    onClick(picker) {
      const end = new Date()
      const start = new Date()
      start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
      picker.$emit('pick', [start, end])
    }
  },
  {
    text: '最近一个月',
    onClick(picker) {
      const start = new Date()
      const end = new Date()
      start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
      picker.$emit('pick', [start, end])
    }
  },
  {
    text: '最近三个月',
    onClick(picker) {
      const start = new Date()
      const end = new Date()
      start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)
      picker.$emit('pick', [start, end])
    }
  }
  ]
}

/**
 * 文件上传删除
 * @param  string smallUrl 小图 当该值为 null时是非图片类型
 * @param  string bigUrl   大图
 */
export function delFiles(smallUrl, bigUrl) {
  // console.log("文件删除01========" + smallUrl)
  // console.log("文件删除02========" + bigUrl)
  if (smallUrl === null) {
    deleteFile(bigUrl)
  } else {
    deleteFile(smallUrl)
    deleteFile(bigUrl)
  }
}
// 删除文件请求
function deleteFile(url) {
  axios.get(url, {
    params: {
      isdel: 1
    }
  })
}

export const filterContent = {
  // 匹配html标签中的内容
  delHtmlTag(con) {
    return con && con.replace(/<[^>]+>/g, '')
  },
  // 原样式输出内容
  content(con) {
    if (con === 'null' || con === 'undefined' || con === null || con === undefined || con === '') {
      con = '暂无内容'
    } else {
      con = con.replace(/[ ]/g, '&nbsp;').replace(/\ +/g, '&nbsp;').replace(/\r\n/g, '<br />').replace(/\n/g, '<br />')
    }
    return con
  }
}

// 格式化内容
export function formatterContent(strVal) {
  if (strVal) {
    return strVal.length > 20 ? strVal.substr(0, 20) + '...' : strVal
  } else {
    return '-'
  }
}

// GUID 的格式为“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”，其中的 x 是 0-9 或 a-f 范围内的一个32位十六进制数
export function guid() {
  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
    const r = Math.random() * 16 | 0
    const v = c === 'x' ? r : (r & 0x3 | 0x8)
    return v.toString(16)
  })
}

/**
 * 对象数组去重
 * @oldArr 要去重的数组
 * @attr 要比较的属性
 */
export function uniqueObjArray(oldArr, attr) {
  const allArr = []
  for (let i = 0; i < oldArr.length; i++) {
    let flag = true
    for (let j = 0; j < allArr.length; j++) {
      // 这里的 attr 是比较的属性
      if (oldArr[i][attr] === allArr[j][attr]) {
        flag = false
      }
    }
    if (flag) {
      allArr.push(oldArr[i])
    }
  }
  return allArr
}

/**
 * 防抖动 节流
 */
// scroll 事件本身会触发页面的重新渲染，同时 scroll 事件的 handler 又会被高频度的触发,
// 因此事件的 handler 内部不应该有复杂操作，例如 DOM 操作就不应该放在事件处理中。
// 针对此类高频度触发事件问题（例如页面 scroll ，屏幕 resize，监听用户输入等），有两种常用的解决方法，防抖和节流。
export function debounce(func, wait, immediate) {
  let timeout, args, context, timestamp, result
  const later = function() {
    // 据上一次触发时间间隔
    const last = +new Date() - timestamp

    // 上次被包装函数被调用时间间隔last小于设定时间间隔wait
    if (last < wait && last > 0) {
      timeout = setTimeout(later, wait - last)
    } else {
      timeout = null
      // 如果设定为immediate===true，因为开始边界已经调用过了此处无需调用
      if (!immediate) {
        result = func.apply(context, args)
        if (!timeout) context = args = null
      }
    }
  }
  return function(...args) {
    context = this
    timestamp = +new Date()
    const callNow = immediate && !timeout
    // 如果延时不存在，重新设定延时
    if (!timeout) timeout = setTimeout(later, wait)
    if (callNow) {
      result = func.apply(context, args)
      context = args = null
    }
    return result
  }
}
