public ActionResult Startup(bool reportCompleted = false, int? associatedProjectId = null)
        {
            Project associatedProject = null;

            if (reportCompleted)
                ViewBag.AppMessage = new AppMessage() { Type = AppMessage.Success, Message = AppString.ReportCompleted };
            if (associatedProjectId != null)
            {
                associatedProject = _db.Projects.Single(p => p.Id == associatedProjectId);
                ViewBag.AppMessage = new AppMessage() { Type = AppMessage.Success, Message = String.Format(AppString.ProjectAssociated, associatedProject.Name) };
            }
                

            string userId = User.Identity.GetUserId();

            ErrorLogger.LogString(User.IsInRole("Admin").ToString());

            // Makes sure that users finish previous reports first.
            ReportDAL rDb = new ReportDAL(_db);
            if (rDb.UserHasIncompleteReport(userId))
                return RedirectToAction("Index");

            ReportStartupViewModel model = new ReportStartupViewModel();

            try {
                PrepareProjectsForViewModel(model, associatedProject);
            } catch (Exception e) {
                // User is not logged in properly. Maybe a threading issue? (This code is a workaround)
                ErrorLogger.LogString("Could not log in. userId = " + User.Identity.GetUserId() );
                return RedirectToAction("Index", "Report"); 
            }
            
            // A user must have atleast one associated project to be able to report. Values are set in the PrepareProjectForStartup method call.
            if (model.AvailableProjects == null && model.SelectedProjectName == null)
                return RedirectToAction("Associate", "Project");

            
            PrepareCarsForViewModel(model);

            return View(model);
        }
        public ActionResult Startup(ReportStartupViewModel model)
        {
            if (ModelState.IsValid)
            {
                ReportDAL dal = new ReportDAL(_db);


                string currUserId = User.Identity.GetUserId(); // Calling GetUserId() within a Lambda-expression causes errors

                int? lastOdometerStatus = dal.GetLatestOdometerStatus(model.SelectedCarId);
                if ( lastOdometerStatus != null && model.OdometerStart < lastOdometerStatus ) {
                    ViewBag.OdometerError = String.Format(AppString.ErrorOdometerStart, lastOdometerStatus-1);
                    PrepareCarsForViewModel(model);
                    PrepareProjectsForViewModel(model, null);
                    return View(model);
                }

                Report report = new Report()
                {
                    Date = DateTime.Now,
                    OdometerStart = model.OdometerStart,
                    AssociatedCar = _db.Cars.Single(c => c.Id == model.SelectedCarId),
                    AssociatedProject = _db.Projects.Single(p => p.Id == model.SelectedProjectId),
                    AssociatedUser = _db.Users.Single(u => u.Id == currUserId),
                    FromLocation = model.FromLocation
                };

                // TODO: Perform checks on the received data to make sure that there isn't any user shenanigans going on. For example if a project id was passed that the user isn't associated with.

                _db.Reports.Add(report);
                _db.SaveChanges();

                return RedirectToAction("Complete", "Report", new { reportStarted = true });
            }

            return View(model);
        }
        private void PrepareProjectsForViewModel(ReportStartupViewModel model, Project associatedProject)
        {
            string userId = User.Identity.GetUserId();
            List<ProjectSelectListViewModel> selectList = new List<ProjectSelectListViewModel>();
            ProjectDAL pDb = new ProjectDAL(_db);
            List<Project> userProjects = pDb.GetUserProjects(userId).Where(p => p.Active).ToList();
            Project notProjectBound = _db.Projects.Single(p => p.Name == "DefaultProject");
            
            // Add default project first. It should always be first in the list.
            selectList.Add(new ProjectSelectListViewModel()
            {
                Id = notProjectBound.Id,
                FullInfo = "[ " + AppString.ProjectNotBound + " ]"
            });

            // Add the rest.
            foreach (Project p in userProjects)
            {
                selectList.Add(new ProjectSelectListViewModel()
                {
                    Id = p.Id,
                    FullInfo = p.FullInfo
                });
            }

            if (selectList.Count == 1)
            {
                ProjectSelectListViewModel foundProject = selectList.First();

                model.SelectedProjectName = foundProject.FullInfo;
                model.SelectedProjectId = foundProject.Id;
            }
            else
            {
                int id = -1;
                if (associatedProject != null)
                    id = associatedProject.Id;
                else
                    id = selectList.First().Id;
                model.AvailableProjects = new SelectList(selectList.ToArray(), "Id", "FullInfo", id);
            }
        }
        /* Helper Methods below: */


        private void PrepareCarsForViewModel(ReportStartupViewModel model)
        {
            ICollection<Car> cars = _db.Cars.Where(c => c.Active).ToList();
            ReportDAL rDB = new ReportDAL(_db);
            // User doesn't need to select cars if there is only one available
            int? latestOdometerStatus = null;
            if (cars.Count == 1)
            {
                Car selectedCar = cars.FirstOrDefault();
                model.SelectedCarRegistrationNumber = selectedCar.RegistrationNumber;
                model.SelectedCarId = selectedCar.Id;

                latestOdometerStatus = rDB.GetLatestOdometerStatus(selectedCar.Id); ;
            }
            else
            {
                latestOdometerStatus = rDB.GetLatestOdometerStatus(cars.ToArray()[0].Id);
                model.AvailableCars = new SelectList(cars, "Id", "RegistrationNumber");
            }

            if (latestOdometerStatus != null)
                model.OdometerStart = (int)latestOdometerStatus;
        }