package com.sundot.airport.common.utils;

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

/**
 * 日期工具类
 */
public class BlockedDateUtils {

    /**
     * 生成从开始日期到结束日期（含）的所有日期列表（时间部分为00:00:00）
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 日期列表（按升序排列）
     */
    public static List<Date> generateDateList(Date startDate, Date endDate) {
        List<Date> dateList = new ArrayList<>();
        if (startDate == null || endDate == null || startDate.after(endDate)) {
            return dateList; // 无效输入返回空列表
        }

        // 创建Calendar实例并标准化时间
        Calendar startCal = Calendar.getInstance();
        startCal.setTime(startDate);
        setTimeToMidnight(startCal);

        Calendar endCal = Calendar.getInstance();
        endCal.setTime(endDate);
        setTimeToMidnight(endCal);

        // 遍历日期范围
        while (!startCal.after(endCal)) {
            dateList.add(startCal.getTime()); // 添加当前日期
            startCal.add(Calendar.DAY_OF_MONTH, 1); // 增加一天
        }
        return dateList;
    }

    /**
     * 将Calendar的时间部分设置为00:00:00.000
     */
    private static void setTimeToMidnight(Calendar calendar) {
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
    }

    /**
     *  当前日期（时间部分为 00:00:00）
     */
    public static Date getCurrentDate() {
        Calendar cal = Calendar.getInstance();
        resetTimeFields(cal);
        return cal.getTime();
    }

    /**
     *  本年度 1 月 1 日（时间部分为 00:00:00）
     */
    public static Date getFirstDayOfYear() {
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.DAY_OF_YEAR, 1);  // 设置为当年第一天
        resetTimeFields(cal);
        return cal.getTime();
    }

    /**
     * 重置Calendar的时间字段（秒毫秒）
     */
    private static void resetTimeFields(Calendar cal) {
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MILLISECOND, 0);
    }

}
