package com.awspaas.user.apps.donenow_ivt.utils;

import com.google.common.base.Optional;
import org.apache.commons.lang3.StringUtils;

import java.math.BigDecimal;

/**
 * 
 * @Description
 * @author fengf
 * @date 2020年2月21日 下午5:00:46
 * @version V1.0.0
 */
public class BigDecimalUtil {

	private BigDecimalUtil() {

	}

	public static String add(String v1, String v2) {
		if(StringUtils.isBlank(v1)) {
			v1="0";
		}
		if(StringUtils.isBlank(v2)) {
			v2="0";
		}
		BigDecimal b1 = new BigDecimal(v1);
		BigDecimal b2 = new BigDecimal(v2);
		return b1.add(b2).toPlainString();
	}
	public static String sub(String v1, String v2) {
		if(StringUtils.isBlank(v1)) {
			v1="0";
		}
		if(StringUtils.isBlank(v2)) {
			v2="0";
		}
		BigDecimal b1 = new BigDecimal(v1);
		BigDecimal b2 = new BigDecimal(v2);
		return b1.subtract(b2).toPlainString();
	}
	
	public static String sub(String v1, String v2,String v3) {
		if(StringUtils.isBlank(v1)) {
			v1="0";
		}
		if(StringUtils.isBlank(v2)) {
			v2="0";
		}
		if(StringUtils.isBlank(v3)) {
			v3="0";
		}
		BigDecimal b1 = new BigDecimal(v1);
		BigDecimal b2 = new BigDecimal(v2);
		BigDecimal b3 = new BigDecimal(v3);
		BigDecimal b4 = b1.subtract(b2);
		return b4.subtract(b3).toPlainString();
	}

	public static String mul(String v1, String v2) {
		if(StringUtils.isBlank(v1)) {
			v1="0";
		}
		if(StringUtils.isBlank(v2)) {
			v2="0";
		}
		BigDecimal b1 = new BigDecimal(v1);
		BigDecimal b2 = new BigDecimal(v2);
		return b1.multiply(b2).toPlainString();
	}

	public static String div(String v1, String v2) {
		
		if(StringUtils.isBlank(v1)||StringUtils.isBlank(v2)||v2.equals("0")) {
			return "0";
		}
		BigDecimal b1 = new BigDecimal(v1);
		BigDecimal b2 = new BigDecimal(v2);
		return b1.divide(b2, 2, BigDecimal.ROUND_HALF_UP).toPlainString();//四舍五入,保留2位小数
	}
	
	public static double add(double v1, double v2) {
		BigDecimal b1 = new BigDecimal(v1);
		BigDecimal b2 = new BigDecimal(v2);
		return b1.add(b2).doubleValue();
	}

	public static double sub(double v1, double v2) {
		BigDecimal b1 = new BigDecimal(v1);
		BigDecimal b2 = new BigDecimal(v2);
		return b1.subtract(b2).doubleValue();
	}
	
	public static double mul(double v1, double v2) {
		BigDecimal b1 = new BigDecimal(v1);
		BigDecimal b2 = new BigDecimal(v2);
		return b1.multiply(b2).doubleValue();
	}

	public static double div(double v1, double v2) {
		BigDecimal b1 = new BigDecimal(v1);
		BigDecimal b2 = new BigDecimal(v2);
		return b1.divide(b2, 2, BigDecimal.ROUND_HALF_UP).doubleValue();//四舍五入,保留2位小数
	}
	
	
	public static String div(String v1, String v2,int decimalDigits) {
		if(StringUtils.isBlank(v1)) {
			v1="0";
		}
		if(StringUtils.isBlank(v2)) {
			v2="0";
		}
		BigDecimal b1 = new BigDecimal(v1);
		BigDecimal b2 = new BigDecimal(v2);
		BigDecimal noZeros = b1.divide(b2, decimalDigits, BigDecimal.ROUND_HALF_UP).stripTrailingZeros();
        String result = noZeros.toPlainString();
		return result;
	}
	
	public static double round(double d,int len) {     // 进行四舍五入操作
        BigDecimal b1 = new BigDecimal(d);
        BigDecimal b2 = new BigDecimal(1);
       // 任何一个数字除以1都是原数字
       // ROUND_HALF_UP是BigDecimal的一个常量，表示进行四舍五入的操作
       return b1.divide(b2, len,BigDecimal.ROUND_HALF_UP).doubleValue();
    }
	
	
	/**
	 * BigDecimal的加法运算封装
	 * 
	 * @author : shijing 2017年3月23日下午4:53:21
	 * @param b1
	 * @param bn
	 * @return
	 */
	public static BigDecimal safeAdd(BigDecimal b1, BigDecimal... bn) {
		if (null == b1) {
			b1 = BigDecimal.ZERO;
		}
		if (null != bn) {
			for (BigDecimal b : bn) {
				b1 = b1.add(null == b ? BigDecimal.ZERO : b);
			}
		}
		return b1;
	}

	/**
	 * Integer加法运算的封装
	 * 
	 * @author : shijing 2017年3月23日下午4:54:08
	 * @param b1 第一个数
	 * @param bn 需要加的加法数组
	 * @注 ： Optional 是属于com.google.common.base.Optional<T> 下面的class
	 * @return
	 */
	public static Integer safeAdd(Integer b1, Integer... bn) {
		if (null == b1) {
			b1 = 0;
		}
		Integer r = b1;
		if (null != bn) {
			for (Integer b : bn) {
				r += Optional.fromNullable(b).or(0);
			}
		}
		return r > 0 ? r : 0;
	}

	/**
	 * 计算金额方法
	 * 
	 * @author : shijing 2017年3月23日下午4:53:00
	 * @param b1
	 * @param bn
	 * @return
	 */
	public static BigDecimal safeSubtract(BigDecimal b1, BigDecimal... bn) {
		return safeSubtract(true, b1, bn);
	}

	/**
	 * BigDecimal的安全减法运算
	 * 
	 * @author : shijing 2017年3月23日下午4:50:45
	 * @param isZero 减法结果为负数时是否返回0，true是返回0（金额计算时使用），false是返回负数结果
	 * @param b1     被减数
	 * @param bn     需要减的减数数组
	 * @return
	 */
	public static BigDecimal safeSubtract(Boolean isZero, BigDecimal b1, BigDecimal... bn) {
		if (null == b1) {
			b1 = BigDecimal.ZERO;
		}
		BigDecimal r = b1;
		if (null != bn) {
			for (BigDecimal b : bn) {
				r = r.subtract((null == b ? BigDecimal.ZERO : b));
			}
		}
		return isZero ? (r.compareTo(BigDecimal.ZERO) == -1 ? BigDecimal.ZERO : r) : r;
	}

	/**
	 * 整型的减法运算，小于0时返回0
	 * 
	 * @author : shijing 2017年3月23日下午4:58:16
	 * @param b1
	 * @param bn
	 * @return
	 */
	public static Integer safeSubtract(Integer b1, Integer... bn) {
		if (null == b1) {
			b1 = 0;
		}
		Integer r = b1;
		if (null != bn) {
			for (Integer b : bn) {
				r -= Optional.fromNullable(b).or(0);
			}
		}
		return null != r && r > 0 ? r : 0;
	}
	/**
	 * BigDecimal的乘法运算封装
	 * 
	 * @author : shijing 2017年3月23日下午5:01:57
	 * @param b1
	 * @param b2
	 * @return
	 */
	public static <T extends Number> BigDecimal safeMultiply(T b1, T b2) {
		if (null == b1 || null == b2) {
			return BigDecimal.ZERO;
		}
		return BigDecimal.valueOf(b1.doubleValue()).multiply(BigDecimal.valueOf(b2.doubleValue())).setScale(2, BigDecimal.ROUND_HALF_UP);
	}
	/**
	 * 金额除法计算，返回2位小数（具体的返回多少位大家自己看着改吧）
	 * 
	 * @author : shijing 2017年3月23日下午5:02:17
	 * @param b1
	 * @param b2
	 * @return
	 */
	public static <T extends Number> BigDecimal safeDivide(T b1, T b2) {
		return safeDivide(b1, b2, BigDecimal.ZERO);
	}

	/**
	 * BigDecimal的除法运算封装，如果除数或者被除数为0，返回默认值 默认返回小数位后2位，用于金额计算
	 * 
	 * @author : shijing 2017年3月23日下午4:59:29
	 * @param b1
	 * @param b2
	 * @param defaultValue
	 * @return
	 */
	public static <T extends Number> BigDecimal safeDivide(T b1, T b2, BigDecimal defaultValue) {
		if (null == b1 || null == b2) {
			return defaultValue;
		}
		try {
			return BigDecimal.valueOf(b1.doubleValue()).divide(BigDecimal.valueOf(b2.doubleValue()), 2, BigDecimal.ROUND_HALF_UP);
		} catch (Exception e) {
			return defaultValue;
		}
	}

	public static String isNull(String value) {
		if(StringUtils.isBlank(value)){
			return "0";
		}
		return value;
	}
	
	public static double getDouble(String value) {
		if(StringUtils.isBlank(value)){
			return 0;
		}
		try {
			return Double.valueOf(value);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			return 0;
		}
		
	  }
	}
