package org.jk.rag.utils;

import java.time.*;
import java.time.temporal.TemporalAdjusters;
import java.util.Date;

/**
 * 月份时间工具类：获取当月/上月的开始、结束时间
 */
public class MonthTimeUtils {

    // 默认时区（东八区），可根据业务调整
    private static final ZoneId DEFAULT_ZONE = ZoneId.of("Asia/Shanghai");

    /**
     * 获取当月开始时间（当月1日 00:00:00.000）
     */
    public static LocalDateTime getCurrentMonthStart() {
        // 1. 获取当前日期，调整到当月第一天
        // 2. 时间部分设为00:00:00
        return LocalDateTime.now()
            .with(TemporalAdjusters.firstDayOfMonth())
            .withHour(0)
            .withMinute(0)
            .withSecond(0)
            .withNano(0);
    }

    /**
     * 获取当月结束时间（当月最后一天 23:59:59.999）
     */
    public static LocalDateTime getCurrentMonthEnd() {
        // 1. 获取当前日期，调整到当月最后一天
        // 2. 时间部分设为23:59:59.999
        return LocalDateTime.now()
            .with(TemporalAdjusters.lastDayOfMonth())
            .withHour(23)
            .withMinute(59)
            .withSecond(59)
            .withNano(999_999_999); // 纳秒，对应毫秒的999
    }

    /**
     * 获取上月开始时间（上月1日 00:00:00.000）
     */
    public static LocalDateTime getLastMonthStart() {
        // 1. 获取当前年月，减1个月
        // 2. 取上月第一天，时间设为00:00:00
        YearMonth lastMonth = YearMonth.now().minusMonths(1);
        return LocalDateTime.of(
            lastMonth.getYear(),
            lastMonth.getMonth(),
            1, // 上月1日
            0, 0, 0, 0
        );
    }

    /**
     * 获取上月结束时间（上月最后一天 23:59:59.999）
     */
    public static LocalDateTime getLastMonthEnd() {
        // 1. 获取当前年月，减1个月
        // 2. 取上月最后一天，时间设为23:59:59.999
        YearMonth lastMonth = YearMonth.now().minusMonths(1);
        int lastDay = lastMonth.lengthOfMonth(); // 上月的总天数（自动处理2月/30天/31天）
        return LocalDateTime.of(
            lastMonth.getYear(),
            lastMonth.getMonth(),
            lastDay, // 上月最后一天
            23, 59, 59, 999_999_999
        );
    }

    // 【可选】如果需要带时区的时间（比如转成Date/Timestamp）
    public static ZonedDateTime getCurrentMonthStartWithZone() {
        return getCurrentMonthStart().atZone(DEFAULT_ZONE);
    }

    /**
     * 获取前一天的开始时间 - LocalDateTime类型（yyyy-MM-dd 00:00:00）
     */
    public static LocalDateTime getYesterdayStart() {
        // 1. 获取当前日期 → 减1天得到前一天日期
        LocalDate yesterdayDate = LocalDate.now().minusDays(1);
        // 2. 拼接前一天的最小时间（00:00:00）
        return LocalDateTime.of(yesterdayDate, LocalTime.MIN);
    }

    /**
     * 获取前一天的结束时间 - LocalDateTime类型（yyyy-MM-dd 23:59:59.999999999）
     * 注：9位毫秒精度，数据库datetime/timestamp类型可完全兼容
     */
    public static LocalDateTime getYesterdayEnd() {
        LocalDate yesterdayDate = LocalDate.now().minusDays(1);
        // 拼接前一天的最大时间（23:59:59.999999999）
        return LocalDateTime.of(yesterdayDate, LocalTime.MAX);
    }

    /**
     * 获取前一天的开始时间 - Date类型（适配老代码/原有业务）
     */
    public static Date getYesterdayStartAsDate() {
        return Date.from(getYesterdayStart().atZone(DEFAULT_ZONE).toInstant());
    }

    /**
     * 获取前一天的结束时间 - Date类型（适配老代码/原有业务）
     */
    public static Date getYesterdayEndAsDate() {
        return Date.from(getYesterdayEnd().atZone(DEFAULT_ZONE).toInstant());
    }

    /**
     * 获取今天开始时间 - LocalDateTime类型（yyyy-MM-dd 00:00:00）
     */
    public static LocalDateTime getTodayStart() {
        // 今日日期 + 当天最小时间（00:00:00）
        return LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
    }

    /**
     * 获取今天结束时间 - LocalDateTime类型（yyyy-MM-dd 23:59:59.999999999）
     * 精度9位毫秒，数据库datetime/timestamp（3/6/9位）完全兼容，不会漏查数据
     */
    public static LocalDateTime getTodayEnd() {
        // 今日日期 + 当天最大时间（23:59:59.999999999）
        return LocalDateTime.of(LocalDate.now(), LocalTime.MAX);
    }

    /**
     * 获取今天开始时间 - Date类型（适配实体类/MyBatis查询，兼容老代码）
     */
    public static Date getTodayStartAsDate() {
        return Date.from(getTodayStart().atZone(DEFAULT_ZONE).toInstant());
    }

    /**
     * 获取今天结束时间 - Date类型（适配实体类/MyBatis查询，兼容老代码）
     */
    public static Date getTodayEndAsDate() {
        return Date.from(getTodayEnd().atZone(DEFAULT_ZONE).toInstant());
    }
}
