// GET: Sprint/EditSprint/5
        public async Task <ActionResult> EditSprint(int?id)
        {
            //Ensure valid input
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }

            //Find the sprint in the database
            var sprint = await _db.Sprints.FindAsync(id);

            if (sprint == null)
            {
                return(HttpNotFound("Sprint not found."));
            }

            //TODO: Ensure user is allowed access to this project

            //Calculate the earliest start date for this sprint
            var prevSprints      = sprint.Project.Sprints.Where(sprint1 => sprint1.Iteration == sprint.Iteration - 1);
            var prevSprintsArray = prevSprints as Sprint[] ?? prevSprints.ToArray();

            ViewBag.notBefore = prevSprintsArray.Any() ? prevSprintsArray.First().EndDate.ToString("MM-dd-yyyy") : null;

            //Create view model and return
            var model = new SprintEditViewModel()
            {
                Id             = sprint.Id,
                SprintDuration = sprint.Project.SprintDuration,
                StartDate      = sprint.StartDate,
                EndDate        = sprint.EndDate
            };

            return(PartialView("_SprintEdit", model));
        }
        public async Task <ActionResult> EditSprint(SprintEditViewModel model)
        {
            //Ensure model is valid
            if (!ModelState.IsValid)
            {
                return(PartialView("_SprintEdit", model));
            }

            //Find database sprint
            var sprint = await _db.Sprints.FindAsync(model.Id);

            if (sprint == null)
            {
                return(HttpNotFound("Sprint not found."));
            }

            //TODO: Ensure user is allowed access to this project

            //Validate sprint dates
            if (model.EndDate < DateTime.Now)
            {
                model.Error = "You cannot set the end date to the past.";
                return(PartialView("_SprintEdit", model));
            }

            //Attempt to store the edit
            try
            {
                //Update the database
                sprint.StartDate = model.StartDate;
                sprint.EndDate   = model.EndDate;
                await _db.SaveChangesAsync();

                //Update future sprints with new schedule
                var futureSprints = sprint.Project.Sprints.Where(s => s.Iteration > sprint.Iteration);
                var lastSprint    = sprint;
                foreach (var futureSprint in futureSprints)
                {
                    futureSprint.StartDate = lastSprint.EndDate;
                    futureSprint.EndDate   = futureSprint.StartDate.AddDays(7 * sprint.Project.SprintDuration);
                    lastSprint             = futureSprint;
                }
                await _db.SaveChangesAsync();
            }
            catch (Exception exception)
            {
                //Return error
                model.Error = exception.Message;
                return(PartialView("_SprintEdit", model));
            }

            //Create view model and return
            var sprintSettingViewModel = new SprintSettingsViewModel()
            {
                Id            = sprint.Project.Id,
                Info          = "Sprint Updated",
                FormViewModel = new SprintSettingsFormViewModel()
                {
                    Id             = sprint.Project.Id,
                    SprintDuration = sprint.Project.SprintDuration
                },
                TableViewModel = new SprintSettingsTableViewModel()
                {
                    Id      = sprint.Project.Id,
                    Sprints = GetTableItemsList(sprint.Project)
                }
            };

            return(PartialView("_SprintSettings", sprintSettingViewModel));
        }