package com.saye.hospitalgd.util;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * 金额处理工具类
 * 用于处理金额比较、格式化等操作
 *
 * @author system
 * @version 1.0
 * @date 2024/10/22
 */
public class AmountUtil {

    /**
     * 默认精度为2位小数
     */
    private static final int DEFAULT_SCALE = 2;

    /**
     * 默认舍入模式为四舍五入
     */
    private static final RoundingMode DEFAULT_ROUNDING_MODE = RoundingMode.HALF_UP;

    /**
     * 比较两个金额是否相等
     * 会自动处理精度问题，如8.00和8会被认为是相等的
     *
     * @param amount1 金额1（字符串格式）
     * @param amount2 金额2（字符串格式）
     * @return true表示相等，false表示不相等
     */
    public static boolean isAmountEqual(String amount1, String amount2) {
        if (amount1 == null || amount2 == null) {
            return false;
        }

        // 处理空字符串情况
        if (amount1.trim().isEmpty() || amount2.trim().isEmpty()) {
            return amount1.trim().equals(amount2.trim());
        }

        try {
            BigDecimal bd1 = new BigDecimal(amount1.trim()).setScale(DEFAULT_SCALE, DEFAULT_ROUNDING_MODE);
            BigDecimal bd2 = new BigDecimal(amount2.trim()).setScale(DEFAULT_SCALE, DEFAULT_ROUNDING_MODE);
            return bd1.compareTo(bd2) == 0;
        } catch (NumberFormatException e) {
            // 如果转换失败，则进行字符串比较
            return amount1.trim().equals(amount2.trim());
        }
    }

    /**
     * 比较两个金额是否相等
     *
     * @param amount1 金额1（BigDecimal格式）
     * @param amount2 金额2（BigDecimal格式）
     * @return true表示相等，false表示不相等
     */
    public static boolean isAmountEqual(BigDecimal amount1, BigDecimal amount2) {
        if (amount1 == null || amount2 == null) {
            return amount1 == amount2;
        }

        BigDecimal bd1 = amount1.setScale(DEFAULT_SCALE, DEFAULT_ROUNDING_MODE);
        BigDecimal bd2 = amount2.setScale(DEFAULT_SCALE, DEFAULT_ROUNDING_MODE);
        return bd1.compareTo(bd2) == 0;
    }

    /**
     * 格式化金额为标准格式（保留2位小数）
     *
     * @param amount 金额字符串
     * @return 格式化后的金额字符串
     */
    public static String formatAmount(String amount) {
        if (amount == null || amount.trim().isEmpty()) {
            return "0.00";
        }

        try {
            BigDecimal bd = new BigDecimal(amount.trim()).setScale(DEFAULT_SCALE, DEFAULT_ROUNDING_MODE);
            return bd.toString();
        } catch (NumberFormatException e) {
            return amount;
        }
    }

    /**
     * 格式化金额为标准格式（保留2位小数）
     *
     * @param amount 金额BigDecimal
     * @return 格式化后的金额字符串
     */
    public static String formatAmount(BigDecimal amount) {
        if (amount == null) {
            return "0.00";
        }

        return amount.setScale(DEFAULT_SCALE, DEFAULT_ROUNDING_MODE).toString();
    }

    /**
     * 将字符串金额转换为BigDecimal
     *
     * @param amount 金额字符串
     * @return BigDecimal对象
     */
    public static BigDecimal toBigDecimal(String amount) {
        if (amount == null || amount.trim().isEmpty()) {
            return BigDecimal.ZERO;
        }

        try {
            return new BigDecimal(amount.trim()).setScale(DEFAULT_SCALE, DEFAULT_ROUNDING_MODE);
        } catch (NumberFormatException e) {
            return BigDecimal.ZERO;
        }
    }
}