package com.smppw.modaq.infrastructure.util;

import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.smppw.modaq.common.conts.DateConst;
import com.smppw.modaq.common.conts.PatternConsts;

import java.math.BigDecimal;
import java.util.Date;
import java.util.regex.Matcher;

public class ConvertUtil {
    /**
     * 字符串转日期类型
     *
     * @param input 待转换的字符串
     * @return 返回日期如果有时间要去掉时间部分
     */
    public static Date toDate(String input) {
        if (StrUtil.isBlank(input)) {
            return null;
        }
        // 处理类似这样的日期区间"2024/01/01-2024/02/01"
        if (input.contains("-") && input.contains("/")) {
            input = StrUtil.split(input, "-").get(1);
        }
        // 把字符串中的日期分隔符去掉，包括前后和中间
        input = input.replaceAll("-_/", "").trim();
        Matcher matcher = PatternConsts.STRICT_DAY_PATTERN.matcher(input);
        if (matcher.find()) {
            try {
                // 日期格式化，支持格式如下：yyyy年MM月dd日、yyyy-MM-dd、yyyy/MM/dd、yyyy_MM_dd和yyyyMMdd
                return DateUtil.parse(matcher.group(),
                        DatePattern.CHINESE_DATE_PATTERN,
                        DateConst.YYYYMMDD,
                        DatePattern.NORM_DATE_PATTERN,
                        "yyyy/MM/dd",
                        "yyyy_MM_dd",
                        "yyyy.MM.dd",
                        "yyyy年MM月dd");
            } catch (Exception ignored) {
            }
        }
        return null;
    }

    public static BigDecimal toBigDecimal(String input) {
        return toBigDecimal(input, null);
    }

    /**
     * 字符串转数字，如果数据没有或者转换失败则用defaultValue字段填充
     *
     * @param input        待转换的字符串
     * @param defaultValue 为null或者数字转换失败的默认值
     * @return /
     */
    public static BigDecimal toBigDecimal(String input, BigDecimal defaultValue) {
        if (StrUtil.isBlank(input)) {
            return defaultValue;
        }
        try {
            // 1. 清理输入，保留有效字符（数字、正负号、小数点、科学计数法符号、千分位逗号）
            String cleanedInput = input.trim().replaceAll("[^\\d.,\\-+Ee]", "");
            // 2. 移除所有空格（包括中间的空格）
            cleanedInput = cleanedInput.replaceAll("\\s+", "");

            // 3. 处理千分位逗号（替换为""，因为千分位逗号在最终数字中无效）
            cleanedInput = cleanedInput.replaceAll(",", "");

            // 4. 处理科学计数法中的符号（如 E 或 e 后的符号）
            // 例如："1.23E+4" → "1.23E4"（可选，但 Java 的 BigDecimal 可直接处理）

            // 5. 验证最终格式是否合法（可选，但可能影响性能）
            // 这里直接交给 BigDecimal 处理，捕获异常即可

            return new BigDecimal(cleanedInput);
        } catch (NumberFormatException e) {
            return defaultValue;
        }
    }
}
