Source: FinanceCalculator.js

/**
 * Copyright Mind Powered Corporation 2020
 * 
 * https://mindpowered.dev/
 */

const maglev = require('@mindpowered/maglev');
const financecalculator = require('../lib/financecalculator.js');

/**
 * A library for performing various finance calculations
 */
class FinanceCalculator {
	constructor() {
		let bus = maglev.maglev.MagLev.getInstance('default');
		let lib = new financecalculator.financecalculator.FinanceCalculator(bus);
	}

	/**
	 * Calculate present value of future money
	 * @param {number} futureValue Future Value
	 * @param {number} numPeriods Number of Periods
	 * @param {number} interestRate Interest Rate
	 * @return {Promise} object containing Present Value and Total Interest Promise will resolve to type object.
	*/
	PresentValueOfFutureMoney(futureValue, numPeriods, interestRate) {
		let jsbus = maglev.maglev.MagLevJs.getInstance('default');
		let args = [futureValue, numPeriods, interestRate];
		let ret = jsbus.call('FinanceCalculator.PresentValueOfFutureMoney', args);
		return ret;
	}

	/**
	 * Calculate the present value of future deposits
	 * @param {number} numPeriods Number of Periods
	 * @param {number} interestRate Interest Rate
	 * @param {number} depositAmount Periodic Deposit Amount
	 * @param {boolean} depositAtBeginning Periodic Deposits made at beginning of period
	 * @return {Promise} object containing Present Value, Total Principal, and Total Interest Promise will resolve to type object.
	*/
	PresentValueOfDeposits(numPeriods, interestRate, depositAmount, depositAtBeginning) {
		let jsbus = maglev.maglev.MagLevJs.getInstance('default');
		let args = [numPeriods, interestRate, depositAmount, depositAtBeginning];
		let ret = jsbus.call('FinanceCalculator.PresentValueOfDeposits', args);
		return ret;
	}

	/**
	 * Calculate the future value of money and/or deposits
	 * @param {number} presentValue Present Value
	 * @param {number} numPeriods Number of Periods
	 * @param {number} interestRate Interest rate as a percentage
	 * @param {number} timesCompoundedPerPeriod Times interest is compounded per period
	 * @param {number} depositAmount Periodic Deposit Amount
	 * @param {boolean} depositAtBeginning Periodic Deposits made at beginning of period
	 * @return {Promise} object containing Future Value and Total Interest Promise will resolve to type object.
	*/
	FutureValue(presentValue, numPeriods, interestRate, timesCompoundedPerPeriod, depositAmount, depositAtBeginning) {
		let jsbus = maglev.maglev.MagLevJs.getInstance('default');
		let args = [presentValue, numPeriods, interestRate, timesCompoundedPerPeriod, depositAmount, depositAtBeginning];
		let ret = jsbus.call('FinanceCalculator.FutureValue', args);
		return ret;
	}

	/**
	 * Calculate net present value
	 * @param {number} initialInvestment Initial Investment
	 * @param {number} discountRate Discount Rate (eg. Interest Rate)
	 * @param {number} timesCompoundedPerPeriod Times discount/interest is compounded per period
	 * @param {number} cashFlowsAtBeginning 
	 * @param {array} cashFlow List of cash flows per period
	 * @return {Promise} Net Present Value Promise will resolve to type number.
	*/
	NetPresentValue(initialInvestment, discountRate, timesCompoundedPerPeriod, cashFlowsAtBeginning, cashFlow) {
		let jsbus = maglev.maglev.MagLevJs.getInstance('default');
		let args = [initialInvestment, discountRate, timesCompoundedPerPeriod, cashFlowsAtBeginning, cashFlow];
		let ret = jsbus.call('FinanceCalculator.NetPresentValue', args);
		return ret;
	}

}
module.exports = FinanceCalculator;