//时间转换为String类型
const moment = require("moment");

function simpleDateFormat(pattern) {
    var fmt = new Object();
    fmt.pattern = pattern;

    fmt.parse = function (source) {
        try {
            return new Date(source);
        } catch (e) {
            console.log("字符串 " + source + " 转时间格式失败！");
            return null;
        }
    };

    fmt.format = function (date) {
        if (typeof (date) == "undefined" || date == null || date == "") {
            return "";
        }

        try {
            date = new Date(date);
        } catch (e) {
            console.log("时间 " + date + " 格式化失败！");
            return "";
        }

        var strTime = this.pattern;//时间表达式的正则

        var o = {
            "M+": date.getMonth() + 1, //月份
            "d+": date.getDate(), //日
            "H+": date.getHours(), //小时
            "m+": date.getMinutes(), //分
            "s+": date.getSeconds(), //秒
            "q+": Math.floor((date.getMonth() + 3) / 3), //季度
            "S": date.getMilliseconds() //毫秒
        };

        if (/(y+)/.test(strTime)) {
            strTime = strTime
                .replace(RegExp.$1, (date.getFullYear() + "")
                    .substr(4 - RegExp.$1.length));
        }
        for (var k in o) {
            if (new RegExp("(" + k + ")").test(strTime)) {
                strTime = strTime.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
            }
        }

        return strTime;
    };
    return fmt;
}

//时间格式化为yyyy-MM-dd
function simpleDateFormatByMoreLine(date) {
    var fmt = simpleDateFormat("yyyy-MM-dd");
    date = fmt.parse(date)
    return fmt.format(date)
}

/**
 * @param dateBegin 开始时间
 * @param dateEnd 结束时间
 * @returns {string} 时间差  天 小时 分钟 秒
 */
function consumingTime(dateBegin, dateEnd) {
    // //如果时间格式是正确的，那下面这一步转化时间格式就可以不用了
    let submitTime = new Date(dateBegin)
    let endTime = new Date(dateEnd)
    var dateDiff = endTime - submitTime;//时间差的毫秒数
    var dayDiff = Math.floor(dateDiff / (24 * 3600 * 1000));//计算出相差天数
    var leave1 = dateDiff % (24 * 3600 * 1000)    //计算天数后剩余的毫秒数
    var hours = Math.floor(leave1 / (3600 * 1000))//计算出小时数
    //计算相差分钟数
    var leave2 = leave1 % (3600 * 1000)    //计算小时数后剩余的毫秒数
    var minutes = Math.floor(leave2 / (60 * 1000))//计算相差分钟数
    //计算相差秒数
    var leave3 = leave2 % (60 * 1000)      //计算分钟数后剩余的毫秒数
    var seconds = Math.round(leave3 / 1000)
    return dayDiff + "天 " + hours + "小时 " + minutes + " 分钟" + seconds + " 秒";
}

export function timeLength(start, dateEnd) {
    // //如果时间格式是正确的，那下面这一步转化时间格式就可以不用了
    let mstart = moment(start);
    let mend = moment(dateEnd);
    let years = mend.diff(start, "years");
    let months = mend.diff(start, "months");
    let days = mend.diff(start, "days");
    let hours = mend.diff(start, "hours");
    let minutes = mend.diff(start, "minutes");
    minutes = minutes % 60;
    hours = hours % 24;
    months = months % 12;
    //因为每月天不固定，所以天要特殊动态处理
    if (mstart.date() < mend.date()) {
        days = mend.date() - mstart.date();
        if (minutes > 0 || hours > 0) {
            days--;
        }
    }
    //处理超过俩月且天超过31
    if (days > 31 && mend.month() - mstart.month() >= 2) {
        //将日期推至上月求差
        days = mend.diff(mstart.add(mend.month() - mstart.month() - 1, "month"), "days");
    }
    return `${years > 0 ? years + "年 " : " "}` + `${months > 0 ? months + "个月 " : " "}` + `${days > 0 ? days + "天 " : " "}`
        + `${hours > 0 ? hours + "小时 " : " "}` + `${minutes > 0 ? minutes + "分钟 " : " "}`;
}

module.exports = {
    formatToYYYYMMDD: simpleDateFormatByMoreLine,
    consumingTime: consumingTime,
    timeLength: timeLength
}
