/*
  @description:所有页面公用方法-时间规则
  @Modifier:肖文龙
  @routerPath:
  @date:2020-3-5 17:19:32
*/
/* api */
import { getTime } from '@api/common/tools.js' // 获取服务器时间
import { getThisTimeRangeHoliday } from '@/api/common/tools.js' // 获取工作日天数
/* 常用方法 */
import { formatTimeSecond } from '@/assets/js/utils' // 保存时间初始化00秒
export const commonMxin = {
  data() {
    return {
      // 限制不可以选择现在之前的时间
      disabledPickerOptions: {
        disabledDate(time) {
          return time.getTime() < Date.now() - 8.64e7
        }
      },
      defaultTimerange: [this.currentTimeFn(), this.currentTimeFn()], // 默认的起始与结束时刻
      defaultTimeDateTime: this.currentTimeFn(), // 默认的时间
      elValueFormatDate: 'yyyy-MM-dd', // element-ui选择框显示格式 日期
      elValueYearMonth: 'yyyy-MM', // $Moment转换格式  年 - 月
      elValueFormat: 'yyyy-MM-dd HH:mm', // element-ui选择框显示格式 日期时间
      elValueSaveFormat: 'yyyy-MM-dd HH:mm:ss', // element-ui选择框-保存时传给后端的格式
      momentYearMonth: 'YYYY-MM', // $Moment转换格式  年 - 月
      momentDate: 'YYYY-MM-DD', // $Moment转换格式 日期
      momentDateTime: 'YYYY-MM-DD HH:mm', // $Moment转换格式 日期时间
      momentSaveFormat: 'YYYY-MM-DD HH:mm:ss', // $Moment转换格式-保存时传给后端的格式
      momentTimeFormat: 'HH:mm:ss',
      holidayNum: '' // 记录已选工作日天数
    }
  },
  methods: {
    /*
    获取当前时间
     */
    currentTimeFn() {
      return this.$Moment().locale('zh-cn').format(this.momentDateTime)
    },
    /*
     获取时间格式mac/window端区分
     解决 ios /mac 时间不显示问题
    */
    isIOSTimeCycle(timeDate) {
      if (this.$store.getters.isIOS && timeDate) {
        // mac/ios 端
        return this.$Moment(formatTimeSecond(timeDate)).format('YYYY/MM/DD HH:mm:ss')
      } else {
        // window/安卓端
        return timeDate
      }
    },
    /*
    * 计算间隔天数
    * @parms：type : years、months、weeks、days、hours、minutes 和 seconds
    * startTime  计算的开始时间,endTime 计算结束时间 daysRule 设置不能小于的时间 message 提示文案 callback 函数回调
    * return 布尔值 true 通过 false 不通过
    */
    transformTime(type, startTime, endTime, daysRule, message, callback) {
      const days = this.$Moment(formatTimeSecond(endTime)).diff(this.$Moment(formatTimeSecond(startTime)), type, true)

      // 算出的时间如果小于时间规则的时间则【提示】
      if (days < daysRule) {
        this.$elAlert(message, 'warning', callback)
      }
      return daysRule <= days
    },
    /*
    * 计算间隔天数-可得正数和负数
    * @parms：type : years、months、weeks、days、hours、minutes 和 seconds
    * startTime 计算的开始时间,endTime 计算结束时间
    * return 间隔天数 days
    */
    momentDiff(type, startTime, endTime) {
      const days = this.$Moment(formatTimeSecond(endTime)).diff(this.$Moment(formatTimeSecond(startTime)), type)
      return days
    },
    /*
    * 计算间隔工作日天数
    * startTime 计算的开始时间,endTime 计算结束时间
    * return 间隔工作日天数
    */
    momentWorkDay(startTime, endTime) {
      return getThisTimeRangeHoliday({
        startTime: startTime,
        endTime: endTime
      }).then((res) => {
        // const days =
        // return days
        const days = res.data.holidayNum
        return new Promise((resolve, reject) => {
          resolve(days)
        })
      })
    },
    /*
      * 计算时间是否相等
      * @parms：type : years、months、weeks、days、hours、minutes 和 seconds
      *  startTime  计算的开始时间,endTime 计算结束时间 message 提示文案 callback 函数回调
      * return 布尔值 true 通过 false 不通过
      */
    equalityFormTime(type, startTime, endTime, message, callback) {
      startTime = this.$Moment(formatTimeSecond(startTime)).format(this.momentDateTime)
      endTime = this.$Moment(formatTimeSecond(endTime)).format(this.momentDateTime)
      const days = this.$Moment(endTime).diff(this.$Moment(startTime), type, true)
      if (days !== 0) {
        this.$elAlert(message, 'warning', callback)
      }
      return days === 0
    },
    /*
    * 计算 startTime 是否小于 endTime
    * @parms：startTime  计算的开始时间,endTime 计算结束时间 message 提示文案 callback 函数回调
    * return 布尔值 true 通过 false 不通过
    */
    computationTime(startTime, endTime, message, callback) {
      if (startTime) startTime = formatTimeSecond(startTime)
      if (endTime) endTime = formatTimeSecond(endTime)
      // startTime 是否小于 endTime 布尔值
      const days = this.$Moment(startTime).isBefore(endTime)
      if (!days && !!message) {
        this.$elAlert(message, 'warning', callback)
      }
      return days
    },
    /*
    * 是否已到截止时间
    * @parms：endTime 截止时间  message 提示文案
    * callback
    */
    countDown(endTime, message) {
      // 获取服务器当前时间
      return getTime().then((res) => {
        // 判断 当前时间 是否小于 截止时间
        const days = this.computationTime(
          res.data.time, // 当前时间
          endTime, // 截止时间
          message// 提示文案
        )
        return new Promise((resolve, reject) => {
          if (days) {
            // 校验通过
            resolve()
          } else {
            // 倒计时计算
            reject('截止时间已到，校验未通过')
          }
        })
      })
    },
    /*
    * 是否满足工作日天数
    * @parms：startTime  计算的开始时间,endTime 计算结束时间 daysRule不能小于的天数 message 提示文案 callback 函数回调
    * callback
    */
    getTimeRangeHoliday(startTime, endTime, daysRule, message, callback) {
      const _this = this
      if (startTime && endTime) {
        // 获取工作日天数
        return getThisTimeRangeHoliday(
          {
            startTime: startTime,
            endTime: endTime
          }
        ).then((res) => {
          // 判断 当前工作日天数 是否小于 设置工作日天数
          _this.holidayNum = res.data.holidayNum
          const days = _this.holidayNum > daysRule
          if (!days) {
            this.$elAlert(message, 'warning', callback)
          }
          // // return days
          return new Promise((resolve, reject) => {
            if (days) {
              // 校验通过
              resolve(days)
            }
          })
          // return Promise.resolve(days)
        })
      } else {
        return false
      }
    }
  }
}
