package com.ruoyi.cms.util;

import com.ruoyi.common.utils.StringUtils;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;

/**
 * 日期校验工具类
 */
public class DateValidateUtil {

    private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    private static final String ERROR_MSG = "生日格式错误！不为空时必须填写 yyyy-MM-dd 完整格式（如 1991-09-01）";

    private static final String DEFAULT_DATE_FORMAT_TIP = "请使用 yyyy-MM-dd 格式";

    // 改为校验 String 类型
    public static String validateBirthDate(String birthDateStr) {
        if (birthDateStr == null || birthDateStr.trim().isEmpty()) {
            return null; // 为空放行
        }

        try {
            // 严格校验格式：必须是 yyyy-MM-dd，且日期合法（如 1991-02-30 会失败）
            LocalDate.parse(birthDateStr.trim(), FORMATTER);
            return null; // 校验通过
        } catch (DateTimeParseException e) {
            return ERROR_MSG; // 格式错误返回提示
        }
    }

    /**
     * 校验开始时间和结束时间的合法性
     * @param startTime 开始时间字符串
     * @param endTime 结束时间字符串
     * @return 校验不通过返回错误信息，校验通过返回null
     */
    public static String validateStartAndEndTime(String startTime, String endTime) {
        StringBuilder errorMsg = new StringBuilder();

        if (StringUtils.isBlank(startTime)) {
            errorMsg.append("开始时间不能为空！");
        } else {
            if (!isValidDate(startTime)) {
                errorMsg.append(StringUtils.isNotBlank(errorMsg.toString()) ? " " : "")
                        .append("开始时间格式错误，").append(DEFAULT_DATE_FORMAT_TIP);
            }
        }

        if (StringUtils.isBlank(endTime)) {
            errorMsg.append(StringUtils.isNotBlank(errorMsg.toString()) ? " " : "")
                    .append("结束时间不能为空！");
        } else {
            if (!isValidDate(endTime)) {
                errorMsg.append(StringUtils.isNotBlank(errorMsg.toString()) ? " " : "")
                        .append("结束时间格式错误，").append(DEFAULT_DATE_FORMAT_TIP);
            } else if (StringUtils.isNotBlank(startTime) && isValidDate(startTime)) {
                if (!isEndTimeAfterStartTime(startTime, endTime)) {
                    errorMsg.append(StringUtils.isNotBlank(errorMsg.toString()) ? " " : "")
                            .append("结束时间不能早于开始时间！");
                }
            }
        }

        return errorMsg.length() > 0 ? errorMsg.toString() : null;
    }

    /**
     * 校验单个日期字符串是否符合 yyyy-MM-dd 格式
     * @param dateStr 日期字符串
     * @return 合法返回true，否则false
     */
    public static boolean isValidDate(String dateStr) {
        if (StringUtils.isBlank(dateStr)) {
            return false;
        }
        try {
            LocalDate.parse(dateStr); // 默认解析 yyyy-MM-dd 格式
            return true;
        } catch (DateTimeParseException e) {
            return false;
        }
    }

    /**
     * 校验结束时间是否晚于开始时间（前提：两个时间格式都合法）
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 结束时间晚于开始时间返回true，否则false
     */
    public static boolean isEndTimeAfterStartTime(String startTime, String endTime) {
        try {
            LocalDate startDate = LocalDate.parse(startTime);
            LocalDate endDate = LocalDate.parse(endTime);
            return !endDate.isBefore(startDate); // 结束时间 >= 开始时间 返回true
        } catch (DateTimeParseException e) {
            return false;
        }
    }
}