private ProjectEditViewModel GenerateEditViewModel(Guid?id)
        {
            if (!id.HasValue || id.Value == Guid.Empty)
            {
                return(null);
            }

            Project foundProject = ProjectRepository.GetProject(id.Value);

            if (foundProject == null)
            {
                return(null);
            }

            return(ProjectEditViewModel.CreateNewViewModel(foundProject, UserRepository));
        }
        [Route("Project/Edit")] //! this is needed because the get action has a route
        public ActionResult Edit(ProjectEditViewModel formData)
        {
            try
            {
                formData.Name = formData.Name?.Trim();

                #region Valid FormData Checks
                if (string.IsNullOrWhiteSpace(formData.Name))
                {
                    ModelState.AddModelError(nameof(formData.Name), "Project Name can't be left empty");
                }

                if (ProjectRepository.IsProjectNameAlreadyTaken(formData.Name, formData.Id))
                {
                    ModelState.AddModelError("", "Error - Project name is already taken");
                }

                if (!ModelState.IsValid)
                {
                    ProjectEditViewModel model;

                    #region Fixes a bug where project add/remove users lists were null (when name was just whitespace)
                    if (formData.UsersAddList == null || formData.UsersRemoveList == null)
                    {
                        Project project = ProjectRepository.GetProject(formData.Id);
                        if (project == null)
                        {
                            return(RedirectToAction(nameof(Index)));
                        }
                        model = ProjectEditViewModel.CreateNewViewModel(project, UserRepository);
                    }
                    else
                    {
                        model = formData;
                    }
                    #endregion
                    return(View(model));
                }
                #endregion

                Project foundProject = ProjectRepository.GetProject(formData.Id);

                if (foundProject == null)
                {
                    return(RedirectToAction(nameof(Index)));
                }

                bool isAddingUsers   = formData.SelectedUsersToAdd != null;
                bool isRemovingUsers = formData.SelectedUsersToRemove != null;

                #region Adding and Removing Users
                if (isAddingUsers)
                {
                    foreach (string userId in formData.SelectedUsersToAdd)
                    {
                        bool isUserAlreadyAssignedToProject = ProjectRepository.IsUserAssignedToProject(userId, foundProject);

                        if (!isUserAlreadyAssignedToProject)
                        {
                            ApplicationUser foundUser = UserRepository.GetUserById(userId);
                            bool            didUserGetAssignedToProject = ProjectRepository.AssignUserToProject(foundUser, foundProject.Id);

                            if (!didUserGetAssignedToProject)
                            {
                                return(RedirectToAction(nameof(Index)));
                            }
                        }
                    }
                }

                if (isRemovingUsers)
                {
                    foreach (string userId in formData.SelectedUsersToRemove)
                    {
                        bool isUserAssignedToProject = ProjectRepository.IsUserAssignedToProject(userId, foundProject);

                        if (isUserAssignedToProject)
                        {
                            //ApplicationUser foundUser = UserRepository.GetUserById(userId);
                            bool didUserGetUnassignedFromProject = ProjectRepository.UnassignUserFromProject(userId, foundProject.Id);

                            if (!didUserGetUnassignedFromProject)
                            {
                                return(RedirectToAction(nameof(Index)));
                            }
                        }
                    }
                }
                #endregion

                foundProject.Name        = formData.Name;
                foundProject.DateUpdated = DateTime.Now;

                DbContext.SaveChanges();

                return(RedirectToAction(nameof(Details), new { Id = formData.Id }));
            }
            catch (Exception e)
            {
                ProjectEditViewModel model = GenerateEditViewModel(formData.Id);

                if (model == null)
                {
                    return(RedirectToAction(nameof(Index)));
                }

                ModelState.AddModelError("", e.Message); // TODO: Remove after project completion (on staging phase)
                return(View(model));
            }
        }