package com.seer.teach.common.utils;

import com.seer.teach.common.enums.teacher.ReportTypeEnum;

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;

public class DateUtils {

    /**
     * 将符合RFC3339标准格式的字符串转换为LocalDateTime对象
     * 格式：yyyy-MM-DDTHH:mm:ss+TIMEZONE
     * 示例：2015-05-20T13:29:35+08:00 表示北京时间2015年5月20日13点29分35秒
     *
     * @param dateTimeStr 日期时间字符串
     * @return LocalDateTime对象（保持原始时区的时间值）
     */
    public static LocalDateTime parseStringToLocalDateTime(String dateTimeStr) {
        if (dateTimeStr == null || dateTimeStr.isEmpty()) {
            return null;
        }
        // 使用ISO_OFFSET_DATE_TIME解析带时区的日期时间字符串
        OffsetDateTime offsetDateTime = OffsetDateTime.parse(dateTimeStr, DateTimeFormatter.ISO_OFFSET_DATE_TIME);

        return offsetDateTime.toLocalDateTime();
    }

    /**
     * 根据创建时间计算距离当前时间相差多少天
     *
     * @param createTime 创建时间（LocalDateTime）
     * @return 相差的天数，例如：5
     */
    public static long calculateDaysFromNow(LocalDateTime createTime) {
        if (createTime == null) {
            return 0;
        }
        // 当前时间
        LocalDateTime now = LocalDateTime.now();
        return ChronoUnit.DAYS.between(createTime, now);
    }


    /**
     * 获取开始时间
     *
     * @param type 类型
     * @return LocalDateTime对象
     */
    public static LocalDateTime getStartTime(ReportTypeEnum type) {
        if (type.getType().equals(0)) {
            // 今天
            return LocalDate.now().atStartOfDay();
        } else if (type.getType().equals(1)) {
            // 本周
            return LocalDate.now().with(DayOfWeek.MONDAY).atStartOfDay();
        } else if (type.getType().equals(2)) {
            // 本月
            return LocalDate.now().withDayOfMonth(1).atStartOfDay();
        } else {
            throw new IllegalArgumentException("type只能为0、1或2");
        }
    }


    /**
     * 将秒数转换为小时或者天
     *
     * @param seconds 秒数
     * @param type    0-今天，1-本周，2-本月
     * @return 时间字符串
     */
    public static String formatSecondsToHourMinute(Integer seconds, ReportTypeEnum type) {
        if (type.getType().equals(0)) {
            // 今天转换为小时和分钟
            return formatSecondsToHourAndMinute(seconds);
        } else if (type.getType().equals(1) || type.getType().equals(2)) {
            // 本周和本月转换为天
            int days = seconds / 86400;
            return days + "天";
        } else {
            throw new IllegalArgumentException("type只能为0、1或2");
        }
    }

    public static String formatSecondsToHourAndMinute(Integer seconds) {
        int hours = seconds / 3600;
        int minutes = (seconds % 3600) / 60;
        if (hours > 0) {
            return hours + "小时" + minutes + "分钟";
        } else {
            return minutes + "分钟";
        }
    }
}