package com.fitbank.installment;

import java.math.BigDecimal;
import java.util.List;

import com.fitbank.common.QuotaBean;
import com.fitbank.common.helper.CalculationBase;
import com.fitbank.common.helper.Constant;
import com.fitbank.fin.helper.FinancialHelper;
import com.fitbank.hb.persistence.gene.Tcurrencyid;

/**
 * Clase que se encarga de ajustar el valor de una cuota fija, con capitalizacion diaria. <br>
 * @author Fitbank
 * @version 2.0
 */
public class AdjustFixedInstallmentCapitalize {

	  /**
	   * Base de calculo que se aplicado a la cuota.
	   */
	  private CalculationBase base ;
	  /**
	   * Tasa total del credito incluye comisiones.
	   */
	  private BigDecimal rate ;
	  /**
	   * Factor acumulativo utilizado en calculo de cuotas en aproximaciones sucesivas.
	   */
	  private BigDecimal totalfactor = BigDecimal.ZERO;

	  /**
	   * Ajusta el valor de la cuota fija, si el valor de la ultima cuota es mayor a la cuota fija.
	   * @param pQuotaTable
	   * @return
	   * @throws Exception
	   */
	  public BigDecimal calculate(InstallmentTable pQuotaTable) throws Exception{
		BigDecimal quotavalue = pQuotaTable.getFixquota();	    
	    rate = pQuotaTable.getTotalrate().divide(new BigDecimal(100),6,BigDecimal.ROUND_HALF_UP);
	    base = pQuotaTable.getCalculationBase();
	    Tcurrencyid tcurrencyid = FinancialHelper.getInstance().getTcurrencyid(pQuotaTable.getCurrency());
	    this.fillFactor(pQuotaTable.getQuotasBean());
	    quotavalue = pQuotaTable.getAmount().divide(totalfactor,tcurrencyid.getNumerodecimales(),BigDecimal.ROUND_HALF_UP);
	    return quotavalue;
	  }
	  
	/**
	 * Crea una lista de cuotas no pagadas y los factores que sumados me permiten hallar el valor presente de una anualidad que no toma en 
	 * consideraci�n per�odos de inter�s deudor.. 
	 * @param tquotas   Lista de cuotas original.
	 * @throws Exception
	 */
	private void fillFactor(List<QuotaBean> lQuotaBean) throws Exception{
		/* = 1/(1+TEA)^(DiasdesDeInicioPrestamoHastaFvenCuota/360)   */
		rate = rate.add(Constant.BD_ONE);
		double days = 0.0;
		for(QuotaBean quota: lQuotaBean){
			days = days + quota.getNumerodiasprovision();
			double factor = Math.pow(rate.doubleValue(),(days/((double)base.getYearBase())));
			factor = 1 / factor; 
			totalfactor = totalfactor.add(BigDecimal.valueOf(factor)) ;
		}
		totalfactor = totalfactor.divide(BigDecimal.ONE,4,BigDecimal.ROUND_HALF_UP);
	}	  
	  
}
