package org.jeecg.common.util;

import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import org.jeecg.common.exception.JeecgBootException;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @description: 日期 时间工作类
 * @author: niugeng
 * @create: 2023-12-13 17:07
 **/
public class DateUtilPlus {

    /**
     * 获取本周七天的时间集合
     * @return {@link List}<{@link String}>
     */
    public static List<String> generate7WeeekDate() {
        // 获取本周的开始时间
        Date startOfWeek = DateUtil.beginOfWeek(DateUtil.date());
        // 获取本周的结束时间
        Date endOfWeek = DateUtil.endOfWeek(DateUtil.date());
        // 获取本周七天的时间集合
        final List<DateTime> dateTimes = DateUtil.rangeToList(startOfWeek, endOfWeek, DateField.DAY_OF_YEAR);

        // 输出本周七天的时间集合
       return dateTimes.stream().map(DateTime::toDateStr).collect(Collectors.toList());
    }

    /**
     * 获取时间内的时间集合
     * @return {@link List}<{@link String}>
     */
    public static List<String> generateBetweenDate(Date start,Date end) {

        // 获取本周七天的时间集合
        final List<DateTime> dateTimes = DateUtil.rangeToList(start, end, DateField.DAY_OF_YEAR);

        // 输出本周七天的时间集合
        return dateTimes.stream().map(DateTime::toDateStr).collect(Collectors.toList());
    }

    /**
     * 获取本年所有月份的时间集合
     * @return {@link List}<{@link String}>
     */
    public static List<String> getAllMonthsOfYear() {
        final DateTime date = DateUtil.date();
        // 获取本年的第一天
        Date beginOfYear = DateUtil.beginOfYear(date);
        Date endOfYear = DateUtil.endOfYear(date);

        List<Date> months = new ArrayList<>();
        while (beginOfYear.before(endOfYear)) {
            months.add(beginOfYear);
            beginOfYear = DateUtil.offsetMonth(beginOfYear,1);
        }
        // 输出本周七天的时间集合
        return months.stream().map(o->DateUtil.format(o,"yyyy-MM")).collect(Collectors.toList());
    }

    /**
     * 获取两个日期中的所有日期
     * @param begin 格式:yyyyMMdd
     * @param end   格式:yyyyMMdd
     * @return 格式:yyyyMMdd
     */
    public static List<String> getDayList(String begin, String end) {
        List<String> hashList = new ArrayList<>();

        Date bDate = DateUtil.parse(begin, DatePattern.PURE_DATE_PATTERN);
        Date eDate = DateUtil.parse(end, DatePattern.PURE_DATE_PATTERN);
        //创建日期范围生成器
        List<DateTime> dateList = DateUtil.rangeToList(bDate, eDate, DateField.DAY_OF_YEAR);
        String hash = null;
        for (DateTime dt : dateList) {
            hash = DateUtil.format(dt,DatePattern.PURE_DATE_PATTERN);
            hashList.add(hash);
        }
        return hashList;
    }

    /**
     * 获取两个日期中的所有月份
     * @param begin 格式:yyyyMMdd
     * @param end   格式:yyyyMMdd
     * @return 格式:yyyyMM
     */
    public static List<String> getMonthList(String begin, String end) {
        List<String> hashList = new ArrayList<>();

        Date bDate = DateUtil.parse(begin, DatePattern.PURE_DATE_PATTERN);
        Date eDate = DateUtil.parse(end, DatePattern.PURE_DATE_PATTERN);
        //创建日期范围生成器
        List<DateTime> dateList = DateUtil.rangeToList(bDate, eDate, DateField.MONTH);
        String hash = null;
        for (DateTime dt : dateList) {
            hash = DateUtil.format(dt, "yyyyMM");
            hashList.add(hash);
        }
        return hashList;
    }

    /**
     *  校验时间断阈值 不能超过 yz
     * @param begin 格式:yyyyMMdd
     * @param end   格式:yyyyMMdd
     */
    public static void checkSjdyz(String begin, String end,long yz) {
        if (StrUtil.isBlank(begin)){
            throw  new JeecgBootException("开始时间为空");
        }
        if (StrUtil.isBlank(end)){
            throw  new JeecgBootException("结束时间为空");
        }
        final DateTime parse1;
        final DateTime parse2;
        try {
            parse1 = DateUtil.parse(begin);
            parse2 = DateUtil.parse(end);
        } catch (Exception e) {
            throw new RuntimeException("日期格式不正确,应该为yyyyMMdd");
        }

        final long month = DateUtil.betweenMonth(parse1, parse2, true);

        if (month > yz){
            throw  new JeecgBootException("时间跨度过大,最大跨月:"+yz);
        }
    }



    public static void main(String[] args) {
        System.out.println(getAllMonthsOfYear());
    }
}
