var Calculators = Calculators || {};
Calculators.planning = Calculators.planning || {};

Calculators.planning.EarlyIRA = function EarlyIRA(startYear, startYearSubsequent, age, ageOfBeneficiary, balance, balanceSubsequent, rate, table) {
  this.startYear = new Number(startYear);
  this.startYearSubsequent = new Number(startYearSubsequent);
  this.age = new Number(age);
  this.ageOfBeneficiary = new Number(ageOfBeneficiary);
  this.balance = new Calculators.type.Money(balance);
  this.balanceSubsequent = new Calculators.type.Money(balanceSubsequent);
  this.rate = new Calculators.type.Rate(rate);
  this.table = table;

  this.singleTable = new Calculators.planning.tables.Single();
  this.jointTable = new Calculators.planning.tables.Joint();
  this.uniformTable = new Calculators.planning.tables.Uniform();

  this.getFirstYear = function() {
    return this.startYear;
  }

  this.getSubsequentYear = function() {
    return this.startYearSubsequent;
  }

  this.getAge = function() {
    return this.age;
  }

  this.getBeneficiaryAge = function() {
    return this.ageOfBeneficiary;
  }

  this.getBalance = function() {
    return this.balance;
  }

  this.getSubsequentBalance = function() {
    return this.balanceSubsequent;
  }

  this.getRate = function() {
    return this.rate;
  }

  this.getSubsequentAge = function() {
    return this.age + (this.startYearSubsequent - this.startYear);
  }

  this.getSubsequentBeneficiaryAge = function() {
    return this.ageOfBeneficiary + (this.startYearSubsequent - this.startYear);
  }

  this.getSingleLifeExpectency = function() {
    return this.singleTable.getLifeExpectency(this.age);
  }

  this.getUniformLifeExpectency = function() {
    return this.uniformTable.getLifeExpectency(this.age);
  }

  this.getJointLifeExpectency = function() {
    return this.jointTable.getLifeExpectency(this.age, this.ageOfBeneficiary);
  }

  this.getSingleAnnualDistributionMinimumDistribution = function() {
    return new Calculators.type.Money(this.balance.getAmount() / this.getSingleLifeExpectency());
  }

  this.getUniformAnnualDistributionMinimumDistribution = function() {
    var lifeExpectency = this.getUniformLifeExpectency();
    if (lifeExpectency > 0) {
      return new Calculators.type.Money(this.balance.getAmount() / lifeExpectency);
    }
    else {
      return new Calculators.type.Money(0);
    }
  }

  this.getJointAnnualDistributionMinimumDistribution = function() {
    var lifeExpectency = this.getJointLifeExpectency();
    if (lifeExpectency > 0) {
      return new Calculators.type.Money(this.balance.getAmount() / lifeExpectency);
    }
    else {
      return new Calculators.type.Money(0);
    }
  }

  this.getLifeExpectencyMethod1b = function() {
    var lifeExpectency = 0;
    if (this.table == "single") {
      lifeExpectency = this.singleTable.getLifeExpectency(this.getSubsequentAge());
    }
    else if (this.table == "uniform") {
      lifeExpectency = this.uniformTable.getLifeExpectency(this.getSubsequentAge());
    }
    else if (this.table == "joint") {
      lifeExpectency = this.jointTable.getLifeExpectency(this.getSubsequentAge(), this.getSubsequentBeneficiaryAge());
    }

    return lifeExpectency;
  }

  this.getAnnualDistribution1b = function() {
    var lifeExpectency = this.getLifeExpectencyMethod1b();
    if (lifeExpectency > 0) {
      return new Calculators.type.Money(this.balanceSubsequent.getAmount() / lifeExpectency);
    }
    else {
      return new Calculators.type.Money(0);
    }    
  }

  this.getSingleAnnualDistributionFixedAmortization = function() {
    var formula = new Calculators.math.Formulas();
    return new Calculators.type.Money(-1 * (formula.pmt(this.rate.getAmount(), this.getSingleLifeExpectency(), this.balance.getAmount(), 0.00)));
  }

  this.getUniformAnnualDistributionFixedAmortization = function() {
    var formula = new Calculators.math.Formulas();
    return new Calculators.type.Money(-1 * (formula.pmt(this.rate.getAmount(), this.getUniformLifeExpectency(), this.balance.getAmount(), 0.00)));
  }

  this.getJointAnnualDistributionFixedAmortization = function() {
    var formula = new Calculators.math.Formulas();
    return new Calculators.type.Money(-1 * (formula.pmt(this.rate.getAmount(), this.getJointLifeExpectency(), this.balance.getAmount(), 0.00)));
  }

  this.getSingleAnnuity = function() {
    var formula = new Calculators.math.Formulas();
    return formula.pvPrecision(this.rate.getAmount(), this.getSingleLifeExpectency(), 1, 0, 1);
  }

  this.getJointAnnuity = function() {
    var formula = new Calculators.math.Formulas();
    return formula.pvPrecision(this.rate.getAmount(), this.getJointLifeExpectency(), 1, 0, 1);
  }

  this.getSingleAnnualDistributionFixedAnnuitization = function() {
    return new Calculators.type.Money(this.balance.getAmount() / this.getSingleAnnuity());
  }

  this.getJointAnnualDistributionFixedAnnuitization = function() {
    var annuity = this.getJointAnnuity();
    if (annuity > 0) {
      return new Calculators.type.Money(this.balance.getAmount() / annuity);
    }
    else {
      return new Calculators.type.Money(0);
    }
  }
}

