/// <summary>
        /// Takes the results from ChartMoguls /metrics/all API call
        /// and returns new data points for any values found that match the submitted date/metrics
        /// </summary>
        private IEnumerable <MetricDataPoint> ParseResults(ChartMogulResponse results, DateTime dataDate, DateTime date, IEnumerable <MetricDataPoint> metricDataPoints)
        {
            var resultantDataPoints = new List <MetricDataPoint>();

            // Look for entry for the last day of previous month
            if (results.Entries.Select(e => e.Date == dataDate.ToString("yyyy-MM-dd")).Any())
            {
                var result = results.Entries.FirstOrDefault(e => e.Date == dataDate.ToString("yyyy-MM-dd"));

                // Add new MetricDataPoints for any Metrics that are mapped to any of these DataSources
                var dataPoints = metricDataPoints as IList <MetricDataPoint> ?? metricDataPoints.ToList();

                if (result != null)
                {
                    resultantDataPoints.AddRange(CreateDataPointsForMatches(dataPoints, date, MetricDataSource.ChartMogulMrr, result.Mrr));
                    resultantDataPoints.AddRange(CreateDataPointsForMatches(dataPoints, date, MetricDataSource.ChartMogulArr, result.Arr / 100));
                    resultantDataPoints.AddRange(CreateDataPointsForMatches(dataPoints, date, MetricDataSource.ChartMogulArpa, result.Arpa / 100));
                    resultantDataPoints.AddRange(CreateDataPointsForMatches(dataPoints, date, MetricDataSource.ChartMogulAsp, result.Asp / 100));
                    resultantDataPoints.AddRange(CreateDataPointsForMatches(dataPoints, date, MetricDataSource.ChartMogulCustomerCount, result.Customers));
                    resultantDataPoints.AddRange(CreateDataPointsForMatches(dataPoints, date, MetricDataSource.ChartMogulCcr, result.CustomerChurnRate));
                    resultantDataPoints.AddRange(CreateDataPointsForMatches(dataPoints, date, MetricDataSource.ChartMogulMrrChurnRate, result.MrrChurnRate));
                    resultantDataPoints.AddRange(CreateDataPointsForMatches(dataPoints, date, MetricDataSource.ChartMogulLtv, result.Ltv / 100));
                }
            }

            return(resultantDataPoints);
        }
        public async Task <MetricDataImport> GetData(int companyId, ExternalApiAuth externalApiAuth, IEnumerable <MetricDataPoint> metricDataPoints)
        {
            var metricDataImport = new MetricDataImport {
                success = true
            };

            if (externalApiAuth == null)
            {
                // user is not connected to this API
                return(metricDataImport);
            }

            var resultantDataPoints = new List <MetricDataPoint>();
            var dataPoints          = metricDataPoints as IList <MetricDataPoint> ?? metricDataPoints.ToList();
            var dateList            = dataPoints.Select(d => d.Date).Distinct();

            try
            {
                // Loop for each distinct date provided in the MetricDataPoints
                foreach (var date in dateList)
                {
                    // We want data for the last day of the month specified
                    var dataDate = date.AddMonths(1).AddDays(-1);

                    // Unless that puts us in the future, in which case get today's data
                    if (dataDate > DateTime.Today)
                    {
                        dataDate = DateTime.Today;
                    }

                    var metricsChartMogul = dataPoints.Where(m => m.DataSourceId.HasValue && m.DataSourceId > 0 && m.DataSourceId < 9);
                    if (metricsChartMogul.Any())
                    {
                        // Setup objects for API call
                        var client = GetHttpClient(_externalApi, externalApiAuth);

                        // Call API to get all ChartMogul numbers. They can't take a range of a single day so we need to ask for two even though we only need one : /
                        var response = await client.GetAsync(string.Format(_dataUrl, dataDate.AddDays(-1).ToString("yyyy-MM-dd"), dataDate.ToString("yyyy-MM-dd")));

                        if (response.IsSuccessStatusCode)
                        {
                            // Process resultant JSON
                            string json = await response.Content.ReadAsStringAsync();

                            ChartMogulResponse results = JsonConvert.DeserializeObject <ChartMogulResponse>(json);
                            resultantDataPoints.AddRange(ParseResults(results, dataDate, date, dataPoints));
                        }
                        else
                        {
                            var errMsg = string.Format("{0}: {1}", _externalApi.Name, response.StatusCode);

                            // Don't add the same error multiple times
                            if (!metricDataImport.errors.Any(e => e.ErrorMessage == errMsg))
                            {
                                var err = new JsonError {
                                    ErrorMessage = errMsg
                                };
                                metricDataImport.errors.Add(err);
                            }
                        }
                    }
                }
            }
            catch (Exception e)
            {
                metricDataImport.errors.Add(new JsonError {
                    ErrorMessage = string.Format("{0}: {1}", _externalApi.Name, e.Message)
                });
            }

            metricDataImport.results = resultantDataPoints;

            return(metricDataImport);
        }