package com.sunxung.factoring.component.util;

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

public class EqualPrincipalUtil_yinke {
    
    /**
     * 每期偿还本金. <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 periodRate 期利率
     * @param period 还款总期数
     * @return
     */
    public static Map<Integer, BigDecimal> getPerPeriodInterest(BigDecimal invest, double periodRate, int period) {
        Map<Integer, BigDecimal> inMap = new HashMap<Integer, BigDecimal>();
        BigDecimal principal = getPerPeriodPrincipal(invest, period);
        Map<Integer, BigDecimal> map = getPerPeriodPrincipalInterest(invest, periodRate, period);
        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 periodRate 期利率
     * @param period 还款总期数
     * @return
     */
    public static Map<Integer, BigDecimal> getPerPeriodPrincipalInterest(BigDecimal invest, double periodRate, int period
            ) {
        Map<Integer, BigDecimal> map = new HashMap<Integer, BigDecimal>();
        // 每期本金
        double periodPri = getPerPeriodPrincipal(invest, period).doubleValue();
        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;
    }
    
    /**
     * 按期偿还方式，偿还的总利息.利息总额 = 融资金额×每期利率×(还款期数+1)/2-∑现金流量调整（整列求和，包括第0期） <br/>
     * 
     * @param invest 总借款额（贷款本金）
     * @param periodRate 期利率
     * @param period 还款总期数
     * * @param totalSashFlowAdjust 现金流量调整总额
     * @return
     */
    public static BigDecimal getInterestCount(BigDecimal invest, double periodRate, int period,BigDecimal totalSashFlowAdjust) {
        BigDecimal count = new BigDecimal(0);
        Map<Integer, BigDecimal> mapInterest = getPerPeriodInterest(invest, periodRate, period);
        for (Map.Entry<Integer, BigDecimal> entry : mapInterest.entrySet()) {
            count = count.add(entry.getValue());
        }
        count=count.subtract(totalSashFlowAdjust).setScale(2, BigDecimal.ROUND_HALF_UP);
        return count;
    }


}
