package com.smppw.modaq.domain.dto.report;

import cn.hutool.core.util.StrUtil;
import com.smppw.modaq.common.conts.Constants;
import com.smppw.modaq.domain.entity.report.BaseReportDO;
import lombok.Getter;
import lombok.Setter;

import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;

/**
 * @author wangzaijun
 * @date 2024/10/9 11:08
 * @description 抽象的报告数据父类，全部字段用string传递
 */
@Setter
@Getter
public abstract class BaseReportDTO<T extends BaseReportDO> implements Serializable {
    @Serial
    private static final long serialVersionUID = Constants.DEFAULT_SERIAL_ID;

    private Integer fileId;

    public BaseReportDTO() {
    }

    public BaseReportDTO(Integer fileId) {
        this.fileId = fileId;
    }

    public abstract T toEntity();

    protected void initEntity(T entity) {
        entity.setCreatorId(0);
        entity.setCreateTime(new Date());
        entity.setUpdaterId(0);
        entity.setUpdateTime(new Date());
        entity.setValid(1);
    }

    @Override
    public String toString() {
        return "fileId=" + fileId;
    }

    protected BigDecimal toBigDecimal(String input) {
        return this.toBigDecimal(input, null);
    }

    /**
     * 字符串转数字，如果数据没有或者转换失败则用defaultValue字段填充
     *
     * @param input        待转换的字符串
     * @param defaultValue 为null或者数字转换失败的默认值
     * @return /
     */
    protected 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;
        }
    }
}
