package org.springblade.common.utils;

import lombok.extern.slf4j.Slf4j;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.atomic.AtomicReference;

/**
 * @author jdx
 * 时间：2017-1-6b
 */
@Slf4j
public class CapitalMathUtil {

    /**
     * 订单货款垫资费用计算
     *
     * @param num1    记息金额
     * @param num2    利率
     * @param dateNum 天数
     * @return 返回map值（实际日利率：dateRate，计息天数利息：interest）
     * @throws IllegalAccessException
     */
    public static Map<String, Double> math1(double num1, double num2, int dateNum) throws IllegalAccessException {
        Map<String, Double> map = new HashMap<>();
        //计算实际日利息
        double dayInterest = div(num2, 36000, 10);
        //实际日利率
        map.put("dayRate", dayInterest);
        //计息天数利息
        map.put("interest", mul(mul(num1, dayInterest), dateNum));
        return map;
    }


    /**
     * 获取当月天数
     *
     * @param date 指定时间
     * @return
     */
    public static int getDaysOfMonth(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
    }


    /**
     * 加法计算
     *
     * @param value1 加数
     * @param value2 加数
     * @return
     */
    public static double add(double value1, double value2) {
        BigDecimal val1 = new BigDecimal(Double.valueOf(value1));
        BigDecimal val2 = new BigDecimal(Double.valueOf(value2));
        return val1.add(val2).doubleValue();
    }

    /**
     * 减法计算
     *
     * @param value1 减数
     * @param value2 被减数
     * @return
     */
    public static double sub(double value1, double value2) {
        BigDecimal val1 = new BigDecimal(Double.valueOf(value1));
        BigDecimal val2 = new BigDecimal(Double.valueOf(value2));
        return val1.subtract(val2).doubleValue();
    }

    /**
     * 乘法计算
     *
     * @param value1 乘数
     * @param value2 乘数
     * @return
     */
    public static double mul(double value1, double value2) {
        BigDecimal val1 = new BigDecimal(Double.valueOf(value1));
        BigDecimal val2 = new BigDecimal(Double.valueOf(value2));
        return val1.multiply(val2).doubleValue();
    }

    /**
     * 除法计算
     *
     * @param value1 被除数
     * @param value2 除数
     * @param scale  精度
     * @return
     * @throws IllegalAccessException
     */
    public static double div(double value1, double value2, int scale) throws IllegalAccessException {
        //如果精确范围小于0，抛出异常信息
        if (scale < 0) {
            throw new IllegalAccessException("精确度不能小于0");
        }
        BigDecimal val1 = new BigDecimal(Double.valueOf(value1));
        BigDecimal val2 = new BigDecimal(Double.valueOf(value2));
        return val1.divide(val2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**
     * 处理double精度问，四舍五入保留2位小数
     * @param d
     * @return
     */
    public static double doubleFormat(double d){
        return new BigDecimal(d).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
    }
}
