package cn.iocoder.yudao.module.member.util;

import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.YearMonth;
import java.time.format.DateTimeFormatter;
import java.time.temporal.WeekFields;
import java.util.Locale;

public class MemberTimeUtils {

    // 获取指定月份总共有几周
    public static int getTotalWeeksOfMonth(String yearMonthString) {
        // 获取该月的第一天和最后一天
        LocalDate firstDayOfMonth = convertToLocalDate(yearMonthString, true);
        LocalDate lastDayOfMonth = firstDayOfMonth.withDayOfMonth(firstDayOfMonth.lengthOfMonth());

        // 获取区域的周定义（可以是ISO标准或其他区域标准）
        WeekFields weekFields = WeekFields.of(Locale.getDefault());

        // 获取第一天和最后一天的周数
        int firstWeek = firstDayOfMonth.get(weekFields.weekOfMonth());
        int lastWeek = lastDayOfMonth.get(weekFields.weekOfMonth());

        // 计算总周数
        return lastWeek - firstWeek + 1;
    }

    // 将"yyyy-MM"字符串转换为LocalDate，并决定是该月的第一天还是最后一天
    public static LocalDate convertToLocalDate(String yearMonthString, boolean isFirstDay) {
        // 使用YearMonth类处理"yyyy-MM"格式
        YearMonth yearMonth = YearMonth.parse(yearMonthString);

        // 如果isFirstDay为true，则返回该月的第一天，否则返回最后一天
        return isFirstDay ? yearMonth.atDay(1) : yearMonth.atEndOfMonth();
    }

    // 从"yyyy-MM"字符串中提取年份
    public static int getYearFromYearMonthString(String yearMonthString) {
        // 使用YearMonth类解析字符串
        YearMonth yearMonth = YearMonth.parse(yearMonthString);

        // 返回年份
        return yearMonth.getYear();
    }

    public static int getMonthFromYearMonthString(String yearMonthString) {
        // 使用YearMonth类解析字符串
        YearMonth yearMonth = YearMonth.parse(yearMonthString);

        // 返回年份
        return yearMonth.getMonth().getValue();
    }

    public static String getYearMonth(String time) {
        // 解析成 LocalDate
        LocalDate date = LocalDate.parse(time);
        // 获取年份和月份，并格式化为 yyyy-MM 格式
        return date.format(DateTimeFormatter.ofPattern("yyyy-MM"));
    }

    public static Integer getDay(String time) {
        LocalDate date = LocalDate.parse(time);
        return date.getDayOfMonth();
    }

    public static LocalDateTime getDayStart(String time) {
        // 定义日期字符串格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");

        // 将字符串解析为LocalDate对象
        LocalDate date = LocalDate.parse(time, formatter);

        // 获取当天的开始时间，即00:00:00
        return date.atStartOfDay();
    }

    public static LocalDateTime getDayEnd(String time) {
        // 定义日期字符串格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");

        // 将字符串解析为LocalDate对象
        LocalDate date = LocalDate.parse(time, formatter);

        // 获取当天的结束时间，即23:59:59
        return date.atTime(LocalTime.MAX);
    }

    public static Integer getYear(DateTime date) {
        return DateUtil.year(date);
    }

    public static Integer getMonth(DateTime date) {
        return DateUtil.month(date) + 1;
    }

    public static LocalDateTime string2Time(String time) {
        // 定义日期字符串格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

        // 将字符串解析为LocalDate对象
        return LocalDateTime.parse(time, formatter);
    }

    public static String Time2String(LocalDateTime time) {
        // 定义日期字符串格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

        // 将字符串解析为LocalDate对象
        return time.format(formatter);
    }

    public static String Time2StringDate(LocalDateTime time) {
        // 定义日期字符串格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");

        // 将字符串解析为LocalDate对象
        return time.format(formatter);
    }

}
