public async Task <IHttpActionResult> Actigraphy()
        {
            // https://stackify.com/understanding-asp-net-performance-for-reading-incoming-data/
            string data = await Request.Content.ReadAsStringAsync();

            var viewModels = Newtonsoft.Json.JsonConvert.DeserializeObject <IEnumerable <ActivityViewModel> >(data);

            if (viewModels == null || !viewModels.Any())
            {
                return(BadRequest("Something went wrong. Empty request."));
            }

            string userId = User.Identity.GetUserId();

            try
            {
                BulkCommands.StoreActivities(
                    viewModels.Select(m =>
                {
                    m.UserId = userId;
                    return(m);
                })
                    .ToList());
            }
            catch (Exception e)
            {
                _service.WriteBugReport(userId, e.Message);
            }
            return(Ok());
        }
        public ActionResult Actigraphy(ResearchAccelerometerViewModel model)
        {
            if (!ModelState.IsValid)
            {
                ViewBag.Users = _service.GetUserNames().OrderBy(s => s);
                return(View("Index"));
            }

            ModelState.Clear();
            if (model._From > model._To)
            {
                ModelState.AddModelError("_From", @"The first date must be less than second");
                ModelState.AddModelError("To", @"The first date must be less than second");
                ViewBag.Users = _service.GetUserNames().OrderBy(s => s);
                return(View());
            }

            string fileName, report;
            string exportedUserId = _service.GetUserId(model._UserName);
            var    activities     = BulkCommands.GetActivities(exportedUserId, model._From, model._To);
            List <ActivityPerMinute> activityPerMinute = null;

            switch (model._ActivityOptions)
            {
            case AcceptableActivityOptions.Export:
                model._ExportOptions = AcceptableExportOptions.Text;
                fileName             = "Report";
                report = ReportHelper.GetAccelerometerData(activities);
                break;

            case AcceptableActivityOptions.StandardDeviation:
                model._ExportOptions = AcceptableExportOptions.Text;
                fileName             = "StdDev";
                double devX = StandardDeviation.CalculateStdDev(activities.Select(m => (double)m.X).ToList());
                double devY = StandardDeviation.CalculateStdDev(activities.Select(m => (double)m.Y).ToList());
                double devZ = StandardDeviation.CalculateStdDev(activities.Select(m => (double)m.Z).ToList());
                report = ReportHelper.ExportStdDev(devX, devY, devZ);
                break;

            case AcceptableActivityOptions.EnergyExpenditure:
            case AcceptableActivityOptions.ZeroCrossing:
                activityPerMinute = CalculateActivity.BeginAnalyzation(model._ActivityOptions, activities);
                report            = ReportHelper.ExportProcessedData(activityPerMinute);
                fileName          = string.Concat("Processed-", model._ActivityOptions);
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            activities.Clear();
            GC.Collect();

            switch (model._ExportOptions)
            {
            case AcceptableExportOptions.Chart:
                var chart = ReportHelper.CreateChart(activityPerMinute);

                // ReSharper disable once PossibleNullReferenceException
                activityPerMinute.Clear();
                GC.Collect();

                return(File(chart.GetBytes(), "jpeg",
                            string.Concat(fileName, "-accelerometer - ", model._UserName, " - ", DateTime.Now, ".jpeg")));

            case AcceptableExportOptions.Text:
                return(File(Encoding.UTF8.GetBytes(report), "text/plain",
                            string.Concat(fileName, "-accelerometer - ", model._UserName, " - ", DateTime.Now, ".txt")));

            default:
                throw new ArgumentOutOfRangeException();
            }
        }