package com.yuchen.saas.park.service.util;


import com.alibaba.cloud.commons.lang.StringUtils;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Objects;

/**
 * bigdecimal 工具类
 **/
public class BigdecimalUtil {

    public static final BigDecimal ZERO = BigDecimal.ZERO;
    public static final BigDecimal ONE = BigDecimal.ONE;
    public static final BigDecimal TWO = new BigDecimal("2");
    public static final BigDecimal TEN = new BigDecimal("10");
    public static final BigDecimal ONE_HUNDRED = new BigDecimal("100");

    /**
     * 默认保留小数点
     */
    public static final int DEFAULT_SCALE = 2;

    public static final int FOUR_SCALE = 4;

    public static final int EIGHT_SCALE = 8;

    /**
     * string 转换成 bigdecimal
     *
     * @param str
     * @return
     */
    public static BigDecimal stringConvertBigDecimal(String str) throws NumberFormatException {
        BigDecimal result = BigdecimalUtil.ZERO;
        if (!StringUtils.isEmpty(str)) {
            result = new BigDecimal(str);
        }
        return result;
    }

    /**
     * double  转换成 bigdecimal
     *
     * @param d
     * @return
     */
    public static BigDecimal doubleConvertBigDecimal(Double d) {
        BigDecimal result = BigdecimalUtil.ZERO;
        if (null != d) {
            result = new BigDecimal(d.toString());
        }
        return result;
    }


    /**
     * 加法
     *
     * @param b1
     * @param b2
     * @return
     */
    public static BigDecimal add(BigDecimal b1, BigDecimal b2) {
        return b1.add(b2);
    }

    public static BigDecimal add(BigDecimal... b) {
        BigDecimal res = BigDecimal.ZERO;
        for (BigDecimal b1 : b) {
            res = BigdecimalUtil.add(res, b1);
        }
        return res;
    }

    /**
     * 减法
     *
     * @param b1
     * @param b2
     * @return
     */
    public static BigDecimal subtract(BigDecimal b1, BigDecimal b2) {
        return b1.subtract(b2);
    }

    /**
     * 乘法
     *
     * @param b1
     * @param b2
     * @return
     */
    public static BigDecimal multiply(BigDecimal b1, BigDecimal b2) {
        BigDecimal b3 = b1.multiply(b2);
        return b3.setScale(DEFAULT_SCALE, BigDecimal.ROUND_DOWN);
    }

    /**
     * 乘法
     *
     * @param b1
     * @param b2
     * @param scale
     * @return
     */
    public static BigDecimal multiply(BigDecimal b1, BigDecimal b2, int scale) {
        BigDecimal b3 = b1.multiply(b2);
        return b3.setScale(scale, BigDecimal.ROUND_DOWN);
    }

    public static BigDecimal multiply(BigDecimal b1, BigDecimal b2, int scale, RoundingMode roundingMode) {
        BigDecimal b3 = b1.multiply(b2);
        return b3.setScale(scale,roundingMode);
    }

    /**
     * 除法
     *
     * @param b1
     * @param b2
     * @return
     */
    public static BigDecimal divide(BigDecimal b1, BigDecimal b2) {
        BigDecimal b3 = b1.divide(b2, DEFAULT_SCALE, BigDecimal.ROUND_DOWN);
        return b3;
    }

    /**
     * 除法
     *
     * @param b1
     * @param b2
     * @param scale
     * @return
     */
    public static BigDecimal divide(BigDecimal b1, BigDecimal b2, int scale) {
        BigDecimal b3 = b1.divide(b2, scale, BigDecimal.ROUND_DOWN);
        return b3;
    }

    /**
     * 除法
     * @param b1
     * @param b2
     * @param scale
     * @param roundingMode
     * @return
     */
    public static BigDecimal divide(BigDecimal b1, BigDecimal b2, int scale, RoundingMode roundingMode) {
        BigDecimal b3 = b1.divide(b2, scale, roundingMode);
        return b3;
    }

    /**
     * 小于
     *
     * @return
     */
    public static boolean lt(BigDecimal b1, BigDecimal b2) {
        return b1.compareTo(b2) == -1 ? true : false;
    }

    /**
     * 小于等于
     *
     * @return
     */
    public static boolean lte(BigDecimal b1, BigDecimal b2) {
        return b1.compareTo(b2) != 1 ? true : false;
    }

    /**
     * 等于
     *
     * @return
     */
    public static boolean eq(BigDecimal b1, BigDecimal b2) {
        return b1.compareTo(b2) == 0 ? true : false;
    }

    /**
     * 大于
     *
     * @return
     */
    public static boolean gt(BigDecimal b1, BigDecimal b2) {
        return b1.compareTo(b2) == 1 ? true : false;
    }

    /**
     * 大于等于
     *
     * @return
     */
    public static boolean gte(BigDecimal b1, BigDecimal b2) {
        return b1.compareTo(b2) != -1 ? true : false;
    }


    public static BigDecimal valueOf(String str) {
        return new BigDecimal(str);
    }


    public static String conver(BigDecimal value) {
        if (Objects.nonNull(value)) {
            return value.stripTrailingZeros().toPlainString();
        }
        return BigDecimal.ZERO.toString();
    }

    /**
     * 去掉小数后面没用的0
     * @param value
     * @return
     */
    public static BigDecimal stripTrailingZeros(BigDecimal value) {
        if (Objects.nonNull(value)) {
            return value.stripTrailingZeros();
        }
        return value;
    }

    public static String conver(BigDecimal value, int scale) {
        if (Objects.nonNull(value)) {
            BigDecimal multiply = value.multiply(BigDecimal.valueOf(Math.pow(10, scale)));
            return multiply.stripTrailingZeros().toPlainString();
        }
        return BigDecimal.ZERO.toString();
    }

    public static BigDecimal conver1(BigDecimal value, int scale) {
        if (Objects.nonNull(value)) {
            return value.multiply(BigDecimal.valueOf(Math.pow(10, scale)));
        }
        return BigDecimal.ZERO;
    }


    public static BigDecimal reverse(BigDecimal value, int scale) {
        if (Objects.nonNull(value)) {
            return value.divide(BigDecimal.valueOf(Math.pow(10, scale)));
        }
        return BigDecimal.ZERO;
    }

    /**
     * 取保留几位小数
     *
     * @param b1
     * @param scale
     * @return
     */
    public static BigDecimal setScale(BigDecimal b1, int scale) {
        return b1.setScale(scale, BigDecimal.ROUND_DOWN);
    }

    public static boolean checkIsInt(BigDecimal b1) {
        return new BigDecimal(b1.intValue()).compareTo(b1) == 0;
    }

    // 提交的时候注释掉，否则部署报错
//    public static void main(String[] args) {
//        System.out.println(divide(new BigDecimal(10), new BigDecimal(15), EIGHT_SCALE));
//
//
//    }

}
