package com.sunxung.factoring.component.util;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;

/**
 * @ClassName:EqualPrincipalUtil_new
 * @Description:四舍五入、等额本金工具类（等额本金是指一种贷款的还款方式，是在还款期内把贷款数总额等分，每期偿还同等数额的本金和剩余贷款在该月所产生的利息， 这样由于每期的还款本金额固定，而利息越来越少，借款人起初还款压力较大，但是随时间的推移每期还款数也越来越少。）
 * setScale(2,BigDecimal.ROUND_DOWN)表示不四舍五入，直接截取小数点最后两位，BigDecimal.ROUND_HALF_UP则四舍五入（下同）
 * @Author:wanxiangZhou
 * @Email:303526821@qq.com
 * @Date:2017年3月28日 上午11:18:18
 */
public class EqualPrincipalUtil_new {

    /**
     * 每期偿还本金和利息，公式：每期偿还本金=（贷款本金÷还款期数）+（贷款本金-已归还本金累计额）×期利率. <br/>
     *
     * @param invest 总借款额（贷款本金）
     * @param yearRate 年利率
     * @param period 还款总期数
     * @param base 月基数（比如一年12个月，一季度3个月……）
     * @return
     */
    public static Map<Integer, BigDecimal> getPerPeriodPrincipalInterest(BigDecimal invest, double yearRate, int period,
            double base) {
        Map<Integer, BigDecimal> map = new HashMap<Integer, BigDecimal>();
        // 每期本金
        double periodPri = getPerPeriodPrincipal(invest, period).doubleValue();
        // 获取期利率
        double periodRate = yearRate / base;
        periodRate = new BigDecimal(periodRate).setScale(6, BigDecimal.ROUND_HALF_UP).doubleValue();
        for (int i = 1; i <= period; i++) {
            double periodRes = periodPri + (invest.doubleValue() - periodPri * (i - 1)) * periodRate;
            BigDecimal periodRes_ = new BigDecimal(periodRes).setScale(2, BigDecimal.ROUND_HALF_UP);
            map.put(i, periodRes_);
        }
        return map;
    }

    /**
     * 每期偿还本金. <br/>
     *
     * @param invest 总借款额（贷款本金）
     * @param period 还款总期数
     * @return
     */
    public static BigDecimal getPerPeriodPrincipal(BigDecimal invest, int period) {
        return invest.divide(new BigDecimal(period), 2, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 每期偿还的利息. <br/>
     *
     * @param invest 总借款额（贷款本金）
     * @param yearRate 年利率
     * @param period 还款总期数
     * @param base 月基数
     * @return
     */
    public static Map<Integer, BigDecimal> getPerPeriodInterest(BigDecimal invest, double yearRate, int period,
            double base) {
        Map<Integer, BigDecimal> inMap = new HashMap<Integer, BigDecimal>();
        BigDecimal principal = getPerPeriodPrincipal(invest, period);
        Map<Integer, BigDecimal> map = getPerPeriodPrincipalInterest(invest, yearRate, period, base);
        for (Map.Entry<Integer, BigDecimal> entry : map.entrySet()) {
            BigDecimal principalInterest = entry.getValue();
            BigDecimal interest = principalInterest.subtract(principal);
            interest = interest.setScale(2, BigDecimal.ROUND_HALF_UP);
            inMap.put(entry.getKey(), interest);
        }
        return inMap;
    }

    /**
     * 按期偿还方式，偿还的总利息. <br/>
     *
     * @param invest 总借款额（贷款本金）
     * @param yearRate 年利率
     * @param period 还款总期数
     * @param base 月基数
     * @return
     */
    public static BigDecimal getInterestCount(BigDecimal invest, double yearRate, int period, int base) {
        BigDecimal count = new BigDecimal(0);
        Map<Integer, BigDecimal> mapInterest = getPerPeriodInterest(invest, yearRate, period, base);
        for (Map.Entry<Integer, BigDecimal> entry : mapInterest.entrySet()) {
            count = count.add(entry.getValue());
        }
        return count;
    }

   /* public static void main(String[] args) {
        BigDecimal invest = new BigDecimal(200000);// 本金
        double yearRate = 0.049; // 年利率
        int period = 12;
        Map<Integer, BigDecimal> getPerPeriodPrincipalInterest = getPerPeriodPrincipalInterest(invest, yearRate, period,
                12);
        System.out.println("等额本金---每月本息：" + getPerPeriodPrincipalInterest);
        BigDecimal benjin_period = getPerPeriodPrincipal(invest, period);
        System.out.println("等额本金---每月本金:" + benjin_period);
        Map<Integer, BigDecimal> mapPeriod = getPerPeriodInterest(invest, yearRate, period, 12);
        System.out.println("等额本金---每月利息:" + mapPeriod);
        BigDecimal count_period = getInterestCount(invest, yearRate, period, 12);
        System.out.println("等额本金---总利息：" + count_period);
    }*/
}
