/// <summary>
        /// Calculates the specified model data.
        /// </summary>
        /// <param name="modelData">The model data.</param>
        /// <returns></returns>
        public override BasicAssetValuation Calculate(IAssetControllerData modelData)
        {
            ModelData      = modelData;
            AnalyticsModel = new LeaseAssetAnalytic();
            var metrics = MetricsHelper.GetMetricsToEvaluate(Metrics, AnalyticsModel.Metrics);
            // Determine if DFAM has been requested - if so that's all we evaluate - every other metric is ignored
            var metricsToEvaluate       = metrics.ToArray();
            var analyticModelParameters = new LeaseAssetParameters();

            CalculationResults = new LeaseAssetAnalytic();
            var marketEnvironment = modelData.MarketEnvironment;
            //IRateCurve rate forecast curve = null;
            IRateCurve leaseCurve = null;

            //0. Set the valuation date and recalculate the settlement date. This could mean regenerating all the coupon dates as well
            //Alternatively the lease can be recreated with a different base date = valuation date.
            //1. instantiate curve
            if (marketEnvironment.GetType() == typeof(SimpleMarketEnvironment))
            {
                leaseCurve             = (IRateCurve)((ISimpleMarketEnvironment)marketEnvironment).GetPricingStructure();
                LeaseDiscountCurveName = leaseCurve.GetPricingStructureId().UniqueIdentifier;
            }
            if (marketEnvironment.GetType() == typeof(SimpleRateMarketEnvironment))
            {
                leaseCurve             = ((ISimpleRateMarketEnvironment)marketEnvironment).GetRateCurve();
                LeaseDiscountCurveName = leaseCurve.GetPricingStructureId().UniqueIdentifier;
            }
            if (marketEnvironment.GetType() == typeof(SwapLegEnvironment))
            {
                leaseCurve             = ((ISwapLegEnvironment)marketEnvironment).GetDiscountRateCurve();
                LeaseDiscountCurveName = leaseCurve.GetPricingStructureId().UniqueIdentifier;
            }
            if (marketEnvironment.GetType() == typeof(MarketEnvironment))
            {
                leaseCurve = (IRateCurve)modelData.MarketEnvironment.GetPricingStructure(LeaseDiscountCurveName);
            }
            //2. Set the rate and the Multiplier
            analyticModelParameters.Multiplier = Multiplier;
            //analyticModelParameters.Quote = QuoteValue;
            analyticModelParameters.GrossAmount = StartAmount;
            analyticModelParameters.StepUp      = LeaseRate;
            //3. Get the discount factors
            analyticModelParameters.PaymentDiscountFactors =
                GetDiscountFactors(leaseCurve, AdjustedPeriodDates, modelData.ValuationDate);
            //4. Get the Weightings
            analyticModelParameters.Weightings = Weightings;
            //5. Set the analytic input parameters and Calculate the respective metrics
            AnalyticModelParameters = analyticModelParameters;
            CalculationResults      =
                AnalyticsModel.Calculate <ILeaseAssetResults, LeaseAssetResults>(analyticModelParameters,
                                                                                 metricsToEvaluate);
            //ExpectedCashflows =
            //CashflowPVs =
            return(GetValue(CalculationResults));
        }
        ///// <summary>
        ///// Gets the priceable coupons.
        ///// </summary>
        ///// <value>The priceable coupons.</value>
        //public List<InstrumentControllerBase> Payments
        //{
        //    get
        //    {
        //        List<InstrumentControllerBase> result = null;
        //        if (Payments != null && Payments.Count > 0)
        //        {
        //            result = new List<InstrumentControllerBase>(Payments);
        //        }
        //        return result;
        //    }
        //}

        ///// <summary>
        ///// Gets the stream payment dates.
        ///// </summary>
        ///// <value>The stream payment dates.</value>
        //public IList<DateTime> StreamPaymentDates
        //{
        //    get
        //    {
        //        var datesList = Coupons.Select(coupon => coupon.PaymentDate).ToList();
        //        datesList.Sort();
        //        return datesList;
        //    }
        //}

        #endregion

        #region Constructors

        /// <summary>
        ///
        /// </summary>
        public PriceableLease()
        {
            Multiplier     = 1.0m;
            AnalyticsModel = new LeaseAssetAnalytic();
        }