value method

Implementation

@override
MatexDividendReinvestmentResult value() {
  if (result != null) return result!;

  if (isValid) {
    final reports = <MatexDividendReinvestementYearlyPayoutReport>[];
    MatexDividendReinvestementYearlyPayoutReport? lastReport;
    MatexDividendReinvestementYearlyPayoutReport? futureReport;
    var dividendAmountPerShare =
        toDecimal(state.sharePrice!) * dDividendYield;

    for (var i = 0; i <= state.yearsToGrow!; i++) {
      if (lastReport != null) {
        dividendAmountPerShare =
            toDecimal(lastReport.dividendAmountPerShare) *
                (Decimal.one + dAnnualDividendIncrease);
      }

      if (i < state.yearsToGrow!) {
        lastReport = _makeYearlyReport(lastReport, dividendAmountPerShare);
        reports.add(lastReport);
      } else {
        futureReport = _makeYearlyReport(lastReport, dividendAmountPerShare);
      }
    }

    return MatexDividendReinvestmentResult(
      totalReturn: _computeTotalReturn(lastReport!.endingBalance).toDouble(),
      grossDividendPaid: lastReport.cumulativeGrossAmount,
      netDividendeIncome: futureReport!.netDividendPayout,
      netDividendPaid: lastReport.cumulativeNetAmount,
      totalContribution: dTotalContribution.toDouble(),
      startingBalance: dStartingPrincipal.toDouble(),
      numberOfShares: lastReport.numberOfShares,
      endingBalance: lastReport.endingBalance,
      sharePrice: lastReport.sharePrice,
      yearlyReports: reports,
    );
  }

  return const MatexDividendReinvestmentResult();
}