/**
 *  @title: 日期类
 *  @date: 2020/03/18
 *  @author:zhaobingfeng
 */
import { isDate, isNumber, isString } from './types'
const dateReg = /d{1,4}|M{1,4}|yy(?:yy)?|S{1,3}|Do|ZZ|([HhMsDm])\1?|[aA]|"[^"]*"|'[^']*'/g
const dayNames = [ '日', '一', '二', '三', '四', '五', '六' ]

const formatFlags = {
    D: function D (dateObj) {
        return dateObj.getDay()
    },
    DD: function DD (dateObj) {
        return pad(dateObj.getDay())
    },
    d: function d (dateObj) {
        return dateObj.getDate()
    },
    dd: function dd (dateObj) {
        return pad(dateObj.getDate())
    },
    M: function M (dateObj) {
        return dateObj.getMonth() + 1
    },
    MM: function MM (dateObj) {
        return pad(dateObj.getMonth() + 1)
    },
    yy: function yy (dateObj) {
        return pad(String(dateObj.getFullYear()), 4).substr(2)
    },
    yyyy: function yyyy (dateObj) {
        return pad(dateObj.getFullYear(), 4)
    },
    // 12小时制
    h: function h (dateObj) {
        return dateObj.getHours() % 12 || 12
    },
    hh: function hh (dateObj) {
        return pad(dateObj.getHours() % 12 || 12)
    },
    // 24小时制
    H: function H (dateObj) {
        return dateObj.getHours()
    },
    HH: function HH (dateObj) {
        return pad(dateObj.getHours())
    },
    m: function m (dateObj) {
        return dateObj.getMinutes()
    },
    mm: function mm (dateObj) {
        return pad(dateObj.getMinutes())
    },
    s: function s (dateObj) {
        return dateObj.getSeconds()
    },
    ss: function ss (dateObj) {
        return pad(dateObj.getSeconds())
    }
}

/**
 * 小于几位数补0, 默认小于2位数
 * @param {Number|String} val
 * @param {Number} len = 2
 */
export const pad = (val, len = 2) => {
    val = String(val)
    while (val.length < len) {
        val = '0' + val
    }
    return val
}

/**
 * 根据日期获取星期, 默认当天
 * @param {Date|Number|String} date
 */
export const getWeekName = ({ date, prefix = '星期' } = {}) => {
    date = date || new Date()
    if (isNumber(date) || isString(date)) {
        date = new Date(date)
    }
    if (!isDate(date) || isNaN(date.getTime())) {
        throw new Error('Invalid Date')
    }
    return `${prefix}${dayNames[date.getDay()]}`
}

/**
 * 获取日期,默认当天
 * @param {Date|Number|String} date
 * @param {*} format = 'yyyy-MM-dd'
 * @param {Number} day  当前日期相差天数，-1 -前一天， 1 -后一天， 不传默认当天
 */
export const getDate = ({ date, format = 'yyyy-MM-dd', day = 0 } = {}) => {
    date = date || new Date()
    if (isNumber(date) || isString(date)) {
        date = new Date(date)
    }
    if (!isDate(date) || isNaN(date.getTime())) {
        throw new Error('Invalid Date')
    }
    date.setDate(date.getDate() + day)
    return format.replace(dateReg, function ($0) {
        if (formatFlags[$0](date)) return formatFlags[$0](date)
    })
}

// 获取当天日期 (eg: 2012-09-10)
// pickDate 传入 例如: 默认为当天 -7 代表当天的前七天 7代表当天的后7天
export const getPickDate = function (pickDate = 0) {
    const pick = new Date().getTime() + pickDate * 24 * 60 * 60 * 1000
    const date = new Date(pick)
    const year = date.getFullYear()
    let month = date.getMonth() + 1
    let day = date.getDate()
    if (month < 10) {
        month = '0' + month
    }
    if (day < 10) {
        day = '0' + day
    }
    return year + '-' + month + '-' + day
}

// 日期格式化
// now 为时间 例如 new Date()
// type为1：YYYY-MM-DD
// type为2： YYYY-MM-DD HH:mm
// txt为1：显示的格式为2019-10-01
// txt为2：显示的格式为2019年10月01日
export const currentTime = function (now, type, txt) {
    // let now = new Date()
    let year = now.getFullYear() // 年
    let month = now.getMonth() + 1 // 月
    let day = now.getDate() // 日
    let hh = now.getHours() // 时
    let mm = now.getMinutes() // 分
    let clock = txt === 1 ? year + '-' : year + '年'
    if (month < 10) {
        clock += '0'
    }
    clock += txt === 1 ? month + '-' : month + '月'
    if (day < 10) {
        clock += '0'
    }
    clock += txt === 1 ? day + ' ' : day + '日'
    if (type === 1) {
        return (clock)
    }
    if (hh < 10) {
        clock += '0'
    }
    clock += txt === 1 ? hh + ':' : hh + '时'
    if (mm < 10) clock += '0'
    clock += txt === 1 ? mm : mm + '秒'
    return (clock)
}

// 获取星期 eg: getNowDay('2020-04-16')
export const getWeekDay = function (val) {
    const weekArray = ['日', '一', '二', '三', '四', '五', '六']
    const days = weekArray[new Date(val).getDay()]
    return days
}

// 比较两个日期时间的大小 eg: compareDate('2020-04-16 05:53', '2020-04-18 05:52')
export const compareDate = function (date1, date2) {
    var oDate1 = new Date(date1)
    var oDate2 = new Date(date2)
    if (oDate1.getTime() > oDate2.getTime()) {
        return 1 // 第一个时间大
    } else if (oDate1.getTime() === oDate2.getTime()) {
        return 2 // 两个时间相等
    } else {
        return 3 // 第一个时间小
    }
}
