package vip.xiaonuo.common.util;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.math.BigDecimal;

/**
 * @author xianghao
 * @date 2023-03-20
 */
@Slf4j
public class BigDecimalUtil {
    private static final BigDecimal ZERO = BigDecimal.ZERO;

    /*  等于0 */
    public static boolean isNullOrEqZero(BigDecimal bigDecimal) {
        return bigDecimal == null || bigDecimal.compareTo(ZERO) == 0;
    }

    /* 不等于0 */
    public static boolean isNotNullOrEqZero(BigDecimal bigDecimal) {
        return !isNullOrEqZero(bigDecimal);
    }

    /* 小于0 */
    public static boolean isNullOrLessZero(BigDecimal bigDecimal) {
        return bigDecimal == null || bigDecimal.compareTo(ZERO) < 0;
    }

    /* 不大于0 */
    public static boolean isNullOrLessOrEqZero(BigDecimal bigDecimal) {
        return bigDecimal == null || bigDecimal.compareTo(ZERO) <= 0;
    }

    /* 大于0 */
    public static boolean isGreaterThanZero(BigDecimal bigDecimal) {
        if (bigDecimal == null) {
            return false;
        }
        return bigDecimal.compareTo(ZERO) > 0;
    }

    /* 不小于0 */
    public static boolean isGreaterThanOrEqualToZero(BigDecimal bigDecimal) {
        if (bigDecimal == null) {
            return false;
        }
        return bigDecimal.compareTo(ZERO) >= 0;
    }

    /* 将字符串转换成BigDecimal对象 */
    public static BigDecimal stringToBigDecimal(String stringBigDecimal) {
        if (StringUtils.isBlank(stringBigDecimal)) {
            return BigDecimal.ZERO;
        }
        try {
            return new BigDecimal(stringBigDecimal).setScale(2, 4);
        } catch (Exception e) {
            log.error("stringToBigDecimal is error");
        }
        return BigDecimal.ZERO;
    }

    /* 将null转换为0 */
    public static BigDecimal bigDecimalNullToZero(BigDecimal bigDecimal) {
        if (bigDecimal == null) {
            return BigDecimal.ZERO;
        } else {
            return bigDecimal;
        }
    }

    /* 将null或0转换为1 */
    public static BigDecimal bigDecimalNullToOne(BigDecimal bigDecimal) {
        if (bigDecimal == null || bigDecimal.doubleValue() == 0) {
            return BigDecimal.ONE;
        } else {
            return bigDecimal;
        }
    }

    /**
     * 获取相除百分比
     * 指定精度 scale
     * 除数0时默认1
     *
     * @return BigDecimal
     */
    public static BigDecimal dividePercentage(int dividend, int divisor, int scale) {
        return BigDecimalUtil.dividePercentage(new BigDecimal(dividend), new BigDecimal(divisor), scale);
    }

    /**
     * 获取相除百分比
     * 指定精度 scale
     * 除数0时默认1
     *
     * @return BigDecimal
     */
    public static BigDecimal dividePercentage(Integer dividend, Integer divisor, int scale) {
        return BigDecimalUtil.dividePercentage(dividend == null ? 0 : dividend.intValue(), divisor == null ? 0 : divisor.intValue(), scale);
    }

    /**
     * 获取相除百分比
     * 指定精度 scale
     * 除数0时默认1
     *
     * @return BigDecimal
     */
    public static BigDecimal dividePercentage(BigDecimal dividend, BigDecimal divisor, int scale) {
        return BigDecimalUtil.bigDecimalNullToZero(dividend).multiply(new BigDecimal(100)).divide(BigDecimalUtil.bigDecimalNullToOne(divisor), scale, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 获取相除结果
     * 指定精度 scale
     * 除数0时默认1
     * 四舍五入
     *
     * @return BigDecimal
     */
    public static BigDecimal divide(BigDecimal dividend, BigDecimal divisor, int scale) {
        return BigDecimalUtil.bigDecimalNullToZero(dividend).divide(BigDecimalUtil.bigDecimalNullToOne(divisor), scale, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 获取相除结果
     * 指定精度 scale
     * 除数0时默认1
     *
     * @return BigDecimal
     */
    public static BigDecimal divide(int dividend, int divisor, int scale, int round) {
        return new BigDecimal(dividend).divide(BigDecimalUtil.bigDecimalNullToOne(new BigDecimal(divisor)), scale, round);
    }

    /**
     * 获取相除结果
     * 指定精度 scale
     * 除数0时默认1
     *
     * @return BigDecimal
     */
    public static BigDecimal divide(BigDecimal dividend, BigDecimal divisor, int scale, int round) {
        return BigDecimalUtil.bigDecimalNullToZero(dividend).divide(BigDecimalUtil.bigDecimalNullToOne(divisor), scale, round);
    }

    /**
     * 加一个值
     * 被加数 augend
     */
    public static BigDecimal addVal(BigDecimal val, BigDecimal augend) {
        if (val == null) val = BigDecimal.ZERO;
        return isNullOrEqZero(augend) ? val : val.add(augend);
    }

    /**
     * 减一个值
     */
    public static BigDecimal subVal(BigDecimal val1, BigDecimal val2) {
        if (val1 == null) val1 = BigDecimal.ZERO;
        if (val2 == null) val2 = BigDecimal.ZERO;
        return val1.subtract(val2);
    }

    /**
     * 乘一个值
     */
    public static BigDecimal multiplyVal(BigDecimal val1, BigDecimal val2) {
        return isNullOrEqZero(val1) || isNullOrEqZero(val2) ? BigDecimal.ZERO : val1.multiply(val2);
    }

}
