package com.ruoyi.common.utils;

import cn.hutool.core.date.DateUtil;
import com.ruoyi.common.core.text.Convert;

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

/**
 * @author hlf
 * @date 2021/7/12 14:51
 * 文件说明：日期时间工具
 */
public class DateTimeUtil {

    /**
     * 根据开始时间结束时间 获取中间每过10分钟的所有时间
     *
     * @param beginTime 开始时间
     * @param endTime   结束时间
     * @return 结果
     */
    public static List<Date> getDateList10(Date beginTime, Date endTime) {
        List<Date> dateList = new ArrayList<>();
        dateList.add(beginTime);
        long beginTimeMillis = beginTime.getTime();
        long endTimeMillis = endTime.getTime();
        if (beginTimeMillis < endTimeMillis) {
            for (int i = 0; i < 10000; i++) {
                beginTimeMillis = beginTimeMillis + 600000;
                dateList.add(DateUtil.date(beginTimeMillis));
                if (beginTimeMillis == endTimeMillis) {
                    break;
                }
            }
        }
        return dateList;
    }

    /**
     * 根据开始时间结束时间 获取中间每过15分钟的所有时间
     *
     * @param beginTime 开始时间
     * @param endTime   结束时间
     * @return 结果
     */
    public static List<Date> getDateList15(Date beginTime, Date endTime) {
        List<Date> dateList = new ArrayList<>();
        dateList.add(beginTime);
        long beginTimeMillis = beginTime.getTime();
        long endTimeMillis = endTime.getTime();
        if (beginTimeMillis < endTimeMillis) {
            for (int i = 0; i < 10000; i++) {
                beginTimeMillis = beginTimeMillis + 900000;
                dateList.add(DateUtil.date(beginTimeMillis));
                if (beginTimeMillis == endTimeMillis) {
                    break;
                }
            }
        }
        return dateList;
    }

    /**
     * 根据开始时间结束时间 获取所有的天
     *
     * @param beginTime 开始时间
     * @param endTime   结束时间
     * @return 结果
     */
    public static List<Date> getDayBetween(Date beginTime, Date endTime) {
        List<Date> dateList = new ArrayList<>();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Calendar cal = Calendar.getInstance();
        cal.setTime(beginTime);
        for (long d = cal.getTimeInMillis(); d <= endTime.getTime(); d = get_D_Plaus_1(cal)) {
            dateList.add(DateUtil.parse(simpleDateFormat.format(d), "yyyy-MM-dd"));
        }
        return dateList;
    }

    /**
     * 根据开始时间 结束时间 获取所有月份
     *
     * @param minDate 开始时间
     * @param maxDate 结束时间
     * @return 结果
     */
    public static List<Date> getMonthBetween(Date minDate, Date maxDate) {
        List<Date> dateList = new ArrayList<>();
        //格式化为年月
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Calendar min = Calendar.getInstance();
        Calendar max = Calendar.getInstance();
        min.setTime(minDate);
        min.set(min.get(Calendar.YEAR), min.get(Calendar.MONTH), 1);
        max.setTime(maxDate);
        max.set(max.get(Calendar.YEAR), max.get(Calendar.MONTH), 2);
        while (min.before(max)) {
            dateList.add(DateUtil.parse(simpleDateFormat.format(min.getTime()), "yyyy-MM-dd"));
            min.add(Calendar.MONTH, 1);
        }
        return dateList;
    }

    /**
     * 根据开始时间 结束时间 获取所有年份
     *
     * @param minDate 开始时间
     * @param maxDate 结束时间
     * @return 结果
     */
    public static List<Date> getYearBetween(String minDate, String maxDate) {
        List<Date> dateList = new ArrayList<>();
        if (!"".equals(minDate) && !"".equals(maxDate)) {
            for (int i = Convert.toInt(minDate); i <= Convert.toInt(maxDate); i++) {
                dateList.add(DateUtil.parse(Convert.toStr(i), "yyyy"));
            }
        }
        return dateList;
    }

    /**
     * 获取时间范围内的所有的小时
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return
     */
    public static List<Date> getHourBetween(Date startTime, Date endTime) {
        List<Date> dateList = new ArrayList<Date>();
        DateUtil.minute(startTime);
        SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Calendar beginCal = Calendar.getInstance();
        beginCal.setTime(startTime);
        while (endTime.after(beginCal.getTime())) {
            dateList.add(DateUtil.parse(sd.format(beginCal.getTime()), "yyyy-MM-dd HH:mm:ss"));
            beginCal.add(Calendar.HOUR_OF_DAY, 1);
        }
        return dateList;
    }


    public static long get_D_Plaus_1(Calendar c) {
        c.set(Calendar.DAY_OF_MONTH, c.get(Calendar.DAY_OF_MONTH) + 1);
        return c.getTimeInMillis();
    }
}
