package com.ruoyi.common.utils;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Date;

public class TimeUtil {

    /**
     * 将LocalDateTime转换为Date
     */
    private static Date toDate(LocalDateTime localDateTime) {
        return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
    }

    /**
     * 获取当前时间（保留时分秒）
     */
    private static LocalDateTime currentDateTime() {
        return LocalDateTime.now();
    }

    /**
     * 获取当天时间范围（保留当前时分秒）
     * @return Date数组，[0]=当天开始时间，[1]=当天结束时间
     */
    public static Date[] getTodayRangeWithCurrentTime() {
        ZonedDateTime startOfDay = LocalDate.now().atStartOfDay(ZoneId.systemDefault());
        ZonedDateTime endOfDay = LocalDate.now()
                .atTime(23, 59, 59)
                .atZone(ZoneId.systemDefault());
        return new Date[]{
                Date.from(startOfDay.toInstant()),
                Date.from(endOfDay.toInstant())
        };
    }

    /**
     * 获取近七天时间范围（保留当前时分秒）
     * @param inclusiveToday 是否包含今天
     * @return Date数组，[0]=开始时间，[1]=结束时间
     */
    public static Date[] getLastSevenDaysRangeWithCurrentTime(boolean inclusiveToday) {
        LocalDateTime now = currentDateTime();
        LocalDateTime start = inclusiveToday
                ? now.minusDays(6)  // 包含今天则往前推6天
                : now.minusDays(7); // 不包含今天则往前推7天

        return new Date[]{
                toDate(start),
                toDate(inclusiveToday ? now : now.minusDays(1))
        };
    }

    /**
     * 获取近一个月时间范围（保留当前时分秒）
     * @param inclusiveToday 是否包含今天
     * @return Date数组，[0]=开始时间，[1]=结束时间
     */
    public static Date[] getLastMonthRangeWithCurrentTime(boolean inclusiveToday) {
        LocalDateTime now = currentDateTime();
        LocalDateTime start = now.minusMonths(1);

        return new Date[]{
                toDate(start),
                toDate(inclusiveToday ? now : now.minusDays(1))
        };
    }

    /**
     * 获取近一年时间范围（保留当前时分秒）
     * @param inclusiveToday 是否包含今天
     * @return Date数组，[0]=开始时间，[1]=结束时间
     */
    public static Date[] getLastYearRangeWithCurrentTime(boolean inclusiveToday) {
        LocalDateTime now = currentDateTime();
        LocalDateTime start = now.minusYears(1);

        return new Date[]{
                toDate(start),
                toDate(inclusiveToday ? now : now.minusDays(1))
        };
    }
}
