package com.demo.common.pojo.util;


import com.alibaba.fastjson.JSON;


import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.*;


public class CalendarUtils {


    /**
     * 获取所有的时间范围内的时间,返回格式是yyyy-MM-dd
     * @param startTime
     * @param endTime
     * @return
     */
    public static Set<String> getAllTimeBetween(LocalDateTime beginTime, LocalDateTime endTime){
        Date beginDate = DateTimeUtils.localDateToDate(beginTime.toLocalDate());
        Date endDate = DateTimeUtils.localDateToDate(endTime.toLocalDate());
        Set<String> dateTimes = new LinkedHashSet<>();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Calendar tempStart = Calendar.getInstance();
        tempStart.setTime(beginDate);
        Calendar tempEnd = Calendar.getInstance();
        tempEnd.setTime(endDate);
        tempEnd.add(Calendar.DATE, +1);// 日期加1(包含结束)
        while (tempStart.before(tempEnd)) {
            dateTimes.add(simpleDateFormat.format(tempStart.getTime()));
            tempStart.add(Calendar.DAY_OF_YEAR, 1);
        }
        return dateTimes;
    }
    /**
     * 获取所有的时间范围内的时间,返回格式是yyyy-MM-dd
     * @param startTime
     * @param endTime
     * @return
     */
    public static Set<String> getAllTimeBetween(Date startTime, Date endTime){
        Set<String> dateTimes = new LinkedHashSet<>();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Calendar tempStart = Calendar.getInstance();
        tempStart.setTime(startTime);


        Calendar tempEnd = Calendar.getInstance();
        tempEnd.setTime(endTime);
        tempEnd.add(Calendar.DATE, +1);// 日期加1(包含结束)
        while (tempStart.before(tempEnd)) {
            dateTimes.add(simpleDateFormat.format(tempStart.getTime()));
            tempStart.add(Calendar.DAY_OF_YEAR, 1);
        }
        return dateTimes;
    }
    /**
     * 获取前X天的日期时间
     * @param time
     * @param day
     * @return
     */
    public static Date getBeforeDayTime(Date time, Integer day){
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(time);
        calendar.add(Calendar.DATE, -day);
        return calendar.getTime();
    }
    /**
     * 根据时间获取当前周数
     * @return
     */
    public static Integer getWeekTimeByTime(Date time){
        Calendar calendar = Calendar.getInstance();
        calendar.setFirstDayOfWeek(Calendar.MONDAY);//设置星期一为一周开始的第一天
        calendar.setTimeInMillis(time.getTime());//获得当前的时间戳
        int weekOfYear = calendar.get(Calendar.WEEK_OF_YEAR);//获得当前日期属于今年的第几周
        return weekOfYear;
    }
    /**
     * 获取年份+周数获取周一的时间
     * @param year
     * @param weekTimes
     * @return
     */
    public static Date getWeekTimesStartTime(Integer year, Integer weekTimes){
        Calendar calendar = Calendar.getInstance();
        calendar.setFirstDayOfWeek(Calendar.MONDAY);//设置星期一为一周开始的第一天
        calendar.setWeekDate(year, weekTimes, 2);//获得指定年的第几周的开始日期
        return calendar.getTime();
    }


    /**
     * 获取年份+周数获取周日的时间
     * @param year
     * @param weekTimes
     * @return
     */
    public static Date getWeekTimesEndTime(Integer year, Integer weekTimes){
        Calendar calendar = Calendar.getInstance();
        calendar.setFirstDayOfWeek(Calendar.MONDAY);//设置星期一为一周开始的第一天
        calendar.setWeekDate(year, weekTimes, 1);//获得指定年的第几周的开始日期
        return calendar.getTime();
    }


    /**
     * 获取年份+周数获取周一的时间
     * @param year
     * @param weekTimes
     * @return
     */
    public static LocalDateTime getWeekTimesStartLocalDateTime(Integer year, Integer weekTimes){
        Calendar calendar = Calendar.getInstance();
        calendar.setFirstDayOfWeek(Calendar.MONDAY);//设置星期一为一周开始的第一天
        calendar.setWeekDate(year, weekTimes, 2);//获得指定年的第几周的开始日期
        return DateTimeUtils.parseMinTime(DateTimeUtils.parseLocalDate(calendar.getTime()));
    }


    /**
     * 获取年份+周数获取周日的时间
     * @param year
     * @param weekTimes
     * @return
     */
    public static LocalDateTime getWeekTimesEndLocalDateTime(Integer year, Integer weekTimes){
        Calendar calendar = Calendar.getInstance();
        calendar.setFirstDayOfWeek(Calendar.MONDAY);//设置星期一为一周开始的第一天
        calendar.setWeekDate(year, weekTimes, 1);//获得指定年的第几周的开始日期
        return DateTimeUtils.parseMaxTime(DateTimeUtils.parseLocalDate(calendar.getTime()));
    }
    public static int getMaxWeekNumOfYear(int year) {
        Calendar c = new GregorianCalendar();
        c.set(year, Calendar.DECEMBER, 31, 23, 59, 59);


        return getWeekOfYear(c.getTime());
    }


    public static int getWeekOfYear(Date date) {
        Calendar c = new GregorianCalendar();
        c.setFirstDayOfWeek(Calendar.MONDAY);
        c.setMinimalDaysInFirstWeek(7);
        c.setTime(date);


        return c.get(Calendar.WEEK_OF_YEAR);
    }


    public static List<String> getTimeBetweenWeekTimes(Date startTime, Date endTime){
        List<String> yearOfWeekTimes = new ArrayList<>();
        Integer startYear = Integer.valueOf(startTime.getYear());
        Integer endYear =  Integer.valueOf(endTime.getYear());
        if(endYear>startYear){
            //相差多少年
            int startNowWeekTimes = getWeekTimeByTime(startTime);
            int startMaxWeekTimes = getMaxWeekNumOfYear(startYear);
            for(int i = startNowWeekTimes;i<=startMaxWeekTimes;i++){
                yearOfWeekTimes.add(startYear+"-"+i);
            }
            Integer betweenYear = endYear - startYear;
            for(int i = betweenYear;i>1;i--){
                int nowYear = startYear+betweenYear;
                int weekSize = getMaxWeekNumOfYear(nowYear);
                for(int weekTime = 1;weekTime<=weekSize;weekTime++){
                    yearOfWeekTimes.add(nowYear+"-"+weekTime);
                }
            }
            int endMaxWeekTimes = getWeekTimeByTime(endTime);
            for(int i = 1;i<=endMaxWeekTimes;i++){
                yearOfWeekTimes.add(endYear+"-"+i);
            }
        }else{
            int startNowWeekTimes = getWeekTimeByTime(startTime);
            int endMaxWeekTimes = getWeekTimeByTime(endTime);
            for(int i = startNowWeekTimes;i<=endMaxWeekTimes;i++){
                yearOfWeekTimes.add(startYear+"-"+i);
            }
        }
        return yearOfWeekTimes;
    }


}