package com.sundot.airport.exam.util;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;

/**
 * <b>功能名：</b>BusinessDateUtil<br>
 * <b>说明：</b> 业务日期工具类 <br>
 * <b>著作权：</b> Copyright (C) 2025 SUNDOT CORPORATION<br>
 * <b>修改履历：
 *
 * @author Simon Lin
 */
public class BusinessDateUtil {

    /**
     * 业务日期分界点：上午7点
     */
    private static final LocalTime BUSINESS_DAY_START = LocalTime.of(7, 0, 0);

    /**
     * 获取当前业务日期
     * <p>
     * 规则：当前时间 >= 7:00 则业务日期为当天，否则为前一天
     * </p>
     *
     * @return 业务日期
     */
    public static LocalDate getCurrentBusinessDate() {
        return getBusinessDate(LocalDateTime.now());
    }

    /**
     * 获取指定时间的业务日期
     *
     * @param dateTime 指定时间
     * @return 业务日期
     */
    public static LocalDate getBusinessDate(LocalDateTime dateTime) {
        LocalTime time = dateTime.toLocalTime();
        LocalDate date = dateTime.toLocalDate();

        // 如果当前时间早于7:00，业务日期为前一天
        if (time.isBefore(BUSINESS_DAY_START)) {
            return date.minusDays(1);
        }

        return date;
    }

    /**
     * 获取业务日期的开始时间（7:00:00）
     *
     * @param businessDate 业务日期
     * @return 业务日期开始时间
     */
    public static LocalDateTime getBusinessDateStart(LocalDate businessDate) {
        return LocalDateTime.of(businessDate, BUSINESS_DAY_START);
    }

    /**
     * 获取业务日期的结束时间（次日6:59:59）
     *
     * @param businessDate 业务日期
     * @return 业务日期结束时间
     */
    public static LocalDateTime getBusinessDateEnd(LocalDate businessDate) {
        return LocalDateTime.of(businessDate.plusDays(1), BUSINESS_DAY_START).minusSeconds(1);
    }

    /**
     * 判断两个时间是否在同一个业务日期
     *
     * @param time1 时间1
     * @param time2 时间2
     * @return true-在同一业务日期，false-不在同一业务日期
     */
    public static boolean isSameBusinessDate(LocalDateTime time1, LocalDateTime time2) {
        return getBusinessDate(time1).equals(getBusinessDate(time2));
    }
}
