package cn.com.victorysoft.business.util;

import cn.com.victorysoft.business.constant.DataType;
import cn.com.victorysoft.business.sys.entity.DateRange;
import lombok.SneakyThrows;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class DateUtils extends org.apache.commons.lang3.time.DateUtils {

    /**
     * 获取date的日期的时间范围
     */
    public static DateRange getDailyRange(Date date) {
        return new DateRange(date, DataType.daily);
    }

    /**
     * 获取date的月份的时间范围
     */
    public static DateRange getMonthRange(Date date) {
        return new DateRange(date, DataType.month);
    }

    /**
     * 获取date的季度的时间范围
     */
    public static DateRange getQuarterRange(Date date) {
        return new DateRange(date, DataType.quarter);
    }

    /**
     * 获取date的半年的时间范围
     */
    public static DateRange getHalfYearRange(Date date) {
        return new DateRange(date, DataType.half_year);
    }

    /**
     * 获取date的年的时间范围
     */
    public static DateRange getYearRange(Date date) {
        return new DateRange(date, DataType.year);
    }

    /**
     * 获取date的昨天的时间范围
     */
    public static DateRange getLastDaily(Date date) {
        return getDailyRange(addDays(date, -1));
    }

    /**
     * 获取date的上月的时间范围
     */
    public static DateRange getLastMonth(Date date) {
        return getMonthRange(addMonths(date, -1));
    }

    /**
     * 获取date的上个季度的时间范围
     */
    public static DateRange getLastQuarter(Date date) {
        return getQuarterRange(addMonths(date, -3));
    }

    /**
     * 获取date的上个半年的时间范围
     */
    public static DateRange getLastHalfYear(Date date) {
        return getHalfYearRange(addMonths(date, -6));
    }

    /**
     * 获取date的去年的时间范围
     */
    public static DateRange getLastYear(Date date) {
        return getYearRange(addYears(date, -1));
    }

    /**
     * 获取date的上一周期的时间范围
     */
    public static DateRange getLastRange(Date date, DataType dataType) {
        switch (dataType) {
            case month:
                return getLastMonth(date);
            case quarter:
                return getLastQuarter(date);
            case half_year:
                return getLastHalfYear(date);
            case year:
                return getLastYear(date);
            case daily:
            default:
                return getLastDaily(date);
        }
    }

    /**
     * 获取当前天的上一周期的时间范围
     */
    public static DateRange getLastRange(DataType dataType) {
        return getLastRange(new Date(), dataType);
    }

    /**
     * 获取当前天的时间范围
     */
    public static DateRange getThisDaily() {
        return getDailyRange(new Date());
    }

    /**
     * 获取当前月的时间范围
     */
    public static DateRange getThisMonth() {
        return getMonthRange(new Date());
    }

    /**
     * 获取当前季度的时间范围
     */
    public static DateRange getThisQuarter() {
        return getQuarterRange(new Date());
    }

    /**
     * 获取当前半年的时间范围
     */
    public static DateRange getThisHalfYear() {
        return getHalfYearRange(new Date());
    }

    /**
     * 获取当前年的时间范围
     */
    public static DateRange getThisYear() {
        return getYearRange(new Date());
    }

    /**
     * 日期格式化
     */
    public static String format(Date date, String format) {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(date);
    }

    /**
     * 格式化到天
     */
    public static String formatDate(Date date) {
        return format(date, "yyyy-MM-dd");
    }

    /**
     * 格式化到秒
     */
    public static String formatTime(Date date) {
        return format(date, "yyyy-MM-dd HH:mm:ss");
    }

    /**
     * 今天日期
     */
    public static Date getToday() {
        return DateUtils.truncate(new Date(), Calendar.DATE);
    }

    /**
     * 昨天日期
     */
    public static Date getYesterday() {
        return DateUtils.truncate(DateUtils.addDays(new Date(), -1), Calendar.DATE);
    }

    /**
     * 获取诊断时间，分钟为0或30，秒为0
     */
    public static Date getDiagDate(Date date) {
        if (date == null) return null;
        Date result = DateUtils.setSeconds(date, 0);
        long minute = DateUtils.getFragmentInMinutes(result, Calendar.HOUR_OF_DAY);
        minute = minute < 30 ? 0 : 30;
        result = DateUtils.setMinutes(result, (int) minute);
        return result;
    }

    @SneakyThrows
    public static String getPreviousMonth(String month, int previous) {
        Date date = DateUtils.parseDate(month + "01", "yyyyMMdd");
        date = DateUtils.addMonths(date, previous * -1);
        return DateUtils.format(date, "yyyyMM");
    }

    public static void main(String[] args) {

        System.out.println(getPreviousMonth("202103", 10));

        DateRange dateRange = getThisDaily();
        System.out.println("当天的时间范围：" + dateRange);

        dateRange = getThisMonth();
        System.out.println("当月的时间范围：" + dateRange);

        dateRange = getThisQuarter();
        System.out.println("当前季度的时间范围：" + dateRange);

        dateRange = getThisHalfYear();
        System.out.println("当前半年的时间范围：" + dateRange);

        dateRange = getThisYear();
        System.out.println("当前年的时间范围：" + dateRange);

        Date date = new Date();

        dateRange = getLastDaily(date);
        System.out.println("昨天的时间范围：" + dateRange);

        dateRange = getLastMonth(date);
        System.out.println("上月的时间范围：" + dateRange);

        dateRange = getLastQuarter(date);
        System.out.println("上个季度的时间范围：" + dateRange);

        dateRange = getLastHalfYear(date);
        System.out.println("上个半年的时间范围：" + dateRange);

        dateRange = getLastYear(date);
        System.out.println("去年的时间范围：" + dateRange);

    }

}
