package com.ycwl.basic.utils;

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

/**
 * @date 2022年06月02日 13:40
 * 自定义的BigDecimal计算工具类
 */
public class CustomBigDecimalUtils {

    public static final BigDecimal HUNDRED_BIG_DECIMAL = new BigDecimal("100");

    /**
     * 除法
     *
     * @param divisor      除数
     * @param dividend     被除数
     * @param scale        保留的小数位数
     * @param roundingMode 舍入模式：比如四舍五入
     * @return java.math.BigDecimal
     * @date 2022/6/2 13:43
     */
    public static BigDecimal divide(BigDecimal divisor,
                                    BigDecimal dividend,
                                    int scale,
                                    RoundingMode roundingMode) {
        if (divisor == null || dividend == null) {
            throw new NullPointerException("传入的数据不能为空");
        }

        if (Double.compare(divisor.doubleValue(), BigDecimal.ZERO.doubleValue()) == 0 ||
                Double.compare(dividend.doubleValue(), BigDecimal.ZERO.doubleValue()) == 0) {
            return BigDecimal.ZERO;
        }

        return divisor.divide(dividend, scale, roundingMode);
    }

    /**
     * 除法
     *
     * @param divisor      除数
     * @param dividend     被除数
     * @param scale        保留的小数位数
     * @param roundingMode 舍入模式：比如四舍五入
     * @return java.math.BigDecimal
     * @date 2022/6/2 13:43
     */
    public static BigDecimal divide(Integer divisor,
                                    Integer dividend,
                                    int scale,
                                    RoundingMode roundingMode) {
        if (divisor == null || dividend == null) {
            throw new NullPointerException("传入的数据不能为空");
        }

        if (divisor == 0 || dividend == 0) {
            return BigDecimal.ZERO;
        }

        return new BigDecimal(divisor).divide(new BigDecimal(dividend), scale, roundingMode);
    }

    /**
     * 除法
     *
     * @param divisor      除数
     * @param dividend     被除数
     * @param scale        保留的小数位数
     * @param roundingMode 舍入模式：比如四舍五入
     * @return java.math.BigDecimal
     * @date 2022/6/2 13:43
     */
    public static BigDecimal divide(Double divisor,
                                    Double dividend,
                                    int scale,
                                    RoundingMode roundingMode) {
        if (divisor == null || dividend == null) {
            throw new NullPointerException("传入的数据不能为空");
        }

        if (Double.compare(divisor, BigDecimal.ZERO.doubleValue()) == 0 ||
                Double.compare(dividend, BigDecimal.ZERO.doubleValue()) == 0) {
            return BigDecimal.ZERO;
        }

        return new BigDecimal(String.valueOf(divisor)).divide(new BigDecimal(String.valueOf(dividend)),
                scale, roundingMode);
    }

    /**
     * 除法
     *
     * @param divisor      除数
     * @param dividend     被除数
     * @param scale        保留的小数位数
     * @param roundingMode 舍入模式：比如四舍五入
     * @return java.math.BigDecimal
     * @date 2022/6/2 13:43
     */
    public static BigDecimal divide(Double divisor,
                                    Integer dividend,
                                    int scale,
                                    RoundingMode roundingMode) {
        if (divisor == null || dividend == null) {
            throw new NullPointerException("传入的数据不能为空");
        }

        if (Double.compare(divisor, BigDecimal.ZERO.doubleValue()) == 0 ||
                Double.compare(dividend, BigDecimal.ZERO.doubleValue()) == 0) {
            return BigDecimal.ZERO;
        }

        return new BigDecimal(String.valueOf(divisor)).divide(new BigDecimal(String.valueOf(dividend)),
                scale, roundingMode);
    }

    /**
     * 减法
     *
     * @param subtraction 减数
     * @param minuend     被减数
     * @return java.math.BigDecimal
     * @date 2022/6/2 13:53
     */
    public static BigDecimal subtract(BigDecimal subtraction,
                                      BigDecimal minuend) {
        if (subtraction == null || minuend == null) {
            throw new NullPointerException("传入的数据不能为空");
        }

        return subtraction.subtract(minuend);
    }

    /**
     * 减法
     *
     * @param subtraction 减数
     * @param minuend     被减数
     * @return java.math.BigDecimal
     * @date 2022/6/2 13:53
     */
    public static BigDecimal subtract(Double subtraction,
                                      Double minuend) {
        if (subtraction == null || minuend == null) {
            throw new NullPointerException("传入的数据不能为空");
        }

        return new BigDecimal(String.valueOf(subtraction)).subtract(new BigDecimal(String.valueOf(minuend)));
    }

    /**
     * 减法
     *
     * @param subtraction 减数
     * @param minuend     被减数
     * @return java.math.BigDecimal
     * @date 2022/6/2 13:53
     */
    public static BigDecimal subtract(BigDecimal subtraction,
                                      Double minuend) {
        if (subtraction == null || minuend == null) {
            throw new NullPointerException("传入的数据不能为空");
        }

        return subtraction.subtract(new BigDecimal(minuend));
    }

    /**
     * 加法
     * @date 2022/6/7 17:31
     * @param addend 加数
     * @param summand 被加数
     * @return java.lang.Double
     */
    public static Double add(Double addend,
                             Double summand) {
        if (addend == null || summand == null) {
            throw new NullPointerException("传入的数据不能为空");
        }

        return new BigDecimal(addend.toString()).add(new BigDecimal(summand.toString())).doubleValue();
    }

    /**
     * 加法
     * @date 2022/6/7 17:31
     * @param addend 加数
     * @param summand 被加数
     * @return java.lang.Double
     */
    public static Double add(BigDecimal addend,
                             BigDecimal summand) {
        if (addend == null || summand == null) {
            throw new NullPointerException("传入的数据不能为空");
        }

        return addend.add(summand).doubleValue();
    }

}
