/* ====================================================================
   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
   this work for additional information regarding copyright ownership.
   The ASF licenses this file to You under the Apache License, Version 2.0
   (the "License"); you may not use this file except in compliance with
   the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
==================================================================== */

package org.apache.poi.ss.formula.functions;

/**
  * Implementation of the financial functions pmt, fv, ppmt, ipmt.
  */
public class Finance {

	/**
     * Emulates Excel/Calc's PMT(interest_rate, number_payments, PV, FV, Type)
     * function, which calculates the payments for a loan or the future value of an investment
     * 
     * @param r
     *            - periodic interest rate represented as a decimal.
     * @param nper
     *            - number of total payments / periods.
     * @param pv
     *            - present value -- borrowed or invested principal.
     * @param fv
     *            - future value of loan or annuity.
     * @param type
     *            - when payment is made: beginning of period is 1; end, 0.
     * @return <code>double</code> representing periodic payment amount.
     */
	// http://arachnoid.com/lutusp/finance.html
	static public double pmt(double r, int nper, double pv, double fv, int type) {
	    double pmt = -r * (pv * Math.pow(1 + r, nper) + fv) / ((1 + r*type) * (Math.pow(1 + r, nper) - 1));
	    return pmt;
	}


	/**
     * Overloaded pmt() call omitting type, which defaults to 0.
     * 
     * @see #pmt(double, int, double, double, int)
     */
	static public double pmt(double r, int nper, double pv, double fv) {
	    return pmt(r, nper, pv, fv, 0);
	}
	
	/**
     * Overloaded pmt() call omitting fv and type, which both default to 0.
     * 
     * @see #pmt(double, int, double, double, int)
     */
	static public double pmt(double r, int nper, double pv) {
	    return pmt(r, nper, pv, 0);
	}
	
	
	/**
     * Emulates Excel/Calc's IPMT(interest_rate, period, number_payments, PV,
     * FV, Type) function, which calculates the portion of the payment at a
     * given period that is the interest on previous balance.
     * 
     * @param r
     *            - periodic interest rate represented as a decimal.
     * @param per
     *            - period (payment number) to check value at.
     * @param nper
     *            - number of total payments / periods.
     * @param pv
     *            - present value -- borrowed or invested principal.
     * @param fv
     *            - future value of loan or annuity.
     * @param type
     *            - when payment is made: beginning of period is 1; end, 0.
     * @return <code>double</code> representing interest portion of payment.
     * 
     * @see #pmt(double, int, double, double, int)
     * @see #fv(double, int, double, double, int)
     */
	// http://doc.optadata.com/en/dokumentation/application/expression/functions/financial.html
	static public double ipmt(double r, int per, int nper, double pv, double fv, int type) {
	    double ipmt = fv(r, per - 1, pmt(r, nper, pv, fv, type), pv, type) * r;
	    if (type==1) ipmt /= (1 + r);
	    return ipmt;
	}
	
	static public double ipmt(double r, int per, int nper, double pv, double fv) {
		return ipmt(r, per, nper, pv, fv, 0);
	}
	
	static public double ipmt(double r, int per, int nper, double pv) {
		return ipmt(r, per, nper, pv, 0);
	}
	 
	/**
     * Emulates Excel/Calc's PPMT(interest_rate, period, number_payments, PV,
     * FV, Type) function, which calculates the portion of the payment at a
     * given period that will apply to principal.
     * 
     * @param r
     *            - periodic interest rate represented as a decimal.
     * @param per
     *            - period (payment number) to check value at.
     * @param nper
     *            - number of total payments / periods.
     * @param pv
     *            - present value -- borrowed or invested principal.
     * @param fv
     *            - future value of loan or annuity.
     * @param type
     *            - when payment is made: beginning of period is 1; end, 0.
     * @return <code>double</code> representing principal portion of payment.
     * 
     * @see #pmt(double, int, double, double, int)
     * @see #ipmt(double, int, int, double, double, int)
     */
	static public double ppmt(double r, int per, int nper, double pv, double fv, int type) {
	    return pmt(r, nper, pv, fv, type) - ipmt(r, per, nper, pv, fv, type);
	}
	
	static public double ppmt(double r, int per, int nper, double pv, double fv) {
	    return pmt(r, nper, pv, fv) - ipmt(r, per, nper, pv, fv);
	}
	
	static public double ppmt(double r, int per, int nper, double pv) {
	    return pmt(r, nper, pv) - ipmt(r, per, nper, pv);
	}
	
    /**
     * Emulates Excel/Calc's FV(interest_rate, number_payments, payment, PV,
     * Type) function, which calculates future value or principal at period N.
     * 
     * @param r
     *            - periodic interest rate represented as a decimal.
     * @param nper
     *            - number of total payments / periods.
     * @param pmt
     *            - periodic payment amount.
     * @param pv
     *            - present value -- borrowed or invested principal.
     * @param type
     *            - when payment is made: beginning of period is 1; end, 0.
     * @return <code>double</code> representing future principal value.
     */
	//http://en.wikipedia.org/wiki/Future_value
	static public double fv(double r, int nper, double pmt, double pv, int type) {
	    double fv = -(pv * Math.pow(1 + r, nper) + pmt * (1+r*type) * (Math.pow(1 + r, nper) - 1) / r);
	    return fv;
	}
	
	/**
     * Overloaded fv() call omitting type, which defaults to 0.
     * 
     * @see #fv(double, int, double, double, int)
     */
	static public double fv(double r, int nper, double c, double pv) {
		return fv(r, nper, c, pv, 0);
	}
}

