package com.ytpm.util;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;

public class DateUtil extends cn.hutool.core.date.DateUtil {

    /**
     * 获取日期数字
     */
    public static int getDateNum(LocalDate currentDate) {
        // 定义日期格式化器，格式为YYYYMMDD
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
        // 将当前日期格式化为字符串
        String formattedDate = currentDate.format(formatter);
        // 将字符串转换为整数
        return Integer.parseInt(formattedDate);
    }

    private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    // 获取今日开始时间（00:00:00）
    public static Date getTodayStart() {
        LocalDateTime todayStart = LocalDate.now().atStartOfDay();
        return localDateTimeToDate(todayStart);
    }

    // 获取今日结束时间（23:59:59）
    public static Date getTodayEnd() {
        LocalDateTime todayEnd = LocalDate.now().atTime(23, 59, 59);
        return localDateTimeToDate(todayEnd);
    }

    // 获取昨日开始时间
    public static Date getYesterdayStart() {
        LocalDateTime yesterdayStart = LocalDate.now().minusDays(1).atStartOfDay();
        return localDateTimeToDate(yesterdayStart);
    }

    // 获取昨日结束时间
    public static Date getYesterdayEnd() {
        LocalDateTime yesterdayEnd = LocalDate.now().minusDays(1).atTime(23, 59, 59);
        return localDateTimeToDate(yesterdayEnd);
    }

    // 获取本月开始时间
    public static Date getMonthStart() {
        LocalDateTime monthStart = LocalDate.now().withDayOfMonth(1).atStartOfDay();
        return localDateTimeToDate(monthStart);
    }

    // 获取本月结束时间
    public static Date getMonthEnd() {
        LocalDateTime monthEnd = LocalDate.now().withDayOfMonth(
                LocalDate.now().lengthOfMonth()
        ).atTime(23, 59, 59);
        return localDateTimeToDate(monthEnd);
    }

    // 获取本周周一
    public static Date getWeekStart() {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
        return calendar.getTime();
    }

    //获取本周周日
    public static Date getWeekEnd() {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
        return calendar.getTime();
    }

    private static Date localDateTimeToDate(LocalDateTime localDateTime) {
        return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
    }


    /**
     * 判断date1的日期（yyyy-MM-dd）是否在date2之前或相等
     *
     * @param date1 第一个日期
     * @param date2 第二个日期
     * @return 若date1在date2之前或相等则返回true，否则返回false（任意日期为null时返回false）
     */
    public static boolean beforeSameDay(Date date1, Date date2) {
        if (date1 != null && date2 != null) {
            // 获取两个日期的当天起始时间（00:00:00），忽略时分秒
            Date beginOfDate1 = DateUtil.beginOfDay(date1);
            Date beginOfDate2 = DateUtil.beginOfDay(date2);
            // 比较起始时间：<= 表示date1在date2之前或同一天
            return beginOfDate1.compareTo(beginOfDate2) <= 0;
        }
        return false;
    }

    /**
     * 判断date1的日期（yyyy-MM-dd）是否在date2之后或相等
     *
     * @param date1 第一个日期
     * @param date2 第二个日期
     * @return 若date1在date2之后或相等则返回true，否则返回false（任意日期为null时返回false）
     */
    public static boolean afterSameDay(Date date1, Date date2) {
        if (date1 != null && date2 != null) {
            // 获取两个日期的当天起始时间（00:00:00），忽略时分秒
            Date beginOfDate1 = DateUtil.beginOfDay(date1);
            Date beginOfDate2 = DateUtil.beginOfDay(date2);
            // 比较起始时间：>= 表示date1在date2之后或同一天
            return beginOfDate1.compareTo(beginOfDate2) >= 0;
        }
        return false;
    }
}
