private string ValidateAvailableSeats(PurchaseTicketViewModel ticket, AvailableTrainViewModel train)
        {
            if ("business".Equals(ticket.TravellerClass))
            {
                int difference = (train.BusinessClassPassengersCount + ticket.PassengersCount)
                    - AppConstants.TRAIN_CAPACITY_BUSINESS;

                if (difference > 0)
                {
                    int availableSeats = AppConstants.TRAIN_CAPACITY_BUSINESS - train.BusinessClassPassengersCount;
                    return availableSeats > 0 ? $"There are only { availableSeats } seats available." : "There are no seats available";
                }
            }

            if ("economic".Equals(ticket.TravellerClass))
            {
                int difference = (train.EconomicClassPassengersCount + ticket.PassengersCount)
                    - AppConstants.TRAIN_CAPACITY_ECONOMIC;

                if (difference > 0)
                {
                    int availableSeats = AppConstants.TRAIN_CAPACITY_ECONOMIC - train.EconomicClassPassengersCount;
                    return availableSeats > 0 ? $"There are only { availableSeats } seats available." : "There are no seats available";
                }
            }

            return string.Empty;
        }
        public ActionResult Purchase(PurchaseTicketViewModel ticket)
        {
            var currentUserId = User.Identity.GetUserId();
            var train = db.Trains.Find(ticket.Id);

            if (train == null)
            {
                return new HttpStatusCodeResult(404);
            }

            var viewModel = new AvailableTrainViewModel()
            {
                Id = train.Id,
                Route = train.Route,
                BusinessClassPassengersCount = (db.TrainTickets
                                        .Where(t => t.TrainId == train.Id)
                                        .Where(t => t.IsConfirmed)
                                        .Where(t => t.IsBusinessClass)
                                        .Select(t => t.PassengersCount)
                                        .DefaultIfEmpty()
                                        .Sum()),
                EconomicClassPassengersCount = (db.TrainTickets
                                        .Where(t => t.TrainId == train.Id)
                                        .Where(t => t.IsConfirmed)
                                        .Where(t => !t.IsBusinessClass)
                                        .Select(t => t.PassengersCount)
                                        .DefaultIfEmpty()
                                        .Sum()),
                DepartureTime = train.DepartureTime
            };

            if (train.DepartureTime < DateTime.Now)
            {
                ViewBag.Error = "This train has already departed.";
                return View(viewModel);
            }
            else if (train.DepartureTime > DateTime.Now.AddDays(AppConstants.MAX_DAYS_BEFORE_RESERVATION))
            {
                ViewBag.Error = "You can only purchase tickets as late as two weeks before departure.";
                return View(viewModel);
            }

            string errorMessage = ValidateAvailableSeats(ticket, viewModel);

            if (!string.IsNullOrEmpty(errorMessage))
            {
                ViewBag.Error = errorMessage;
                return View(viewModel);
            }

            var generatedTicket = new TrainTicket()
            {
                UserId = new Guid(currentUserId),
                TrainId = train.Id,
                Departure = train.Route.Departure,
                Arrival = train.Route.Arrival,
                DepartureTime = train.DepartureTime,
                PurchasedOn = DateTime.Now,
                IsBusinessClass = ticket.TravellerClass == "business" ? true : false,
                PassengersCount = ticket.PassengersCount,
                Price = train.Route.Price * ticket.PassengersCount,
                IsConfirmed = false
            };
            generatedTicket.Price *= generatedTicket.IsBusinessClass
                ? AppConstants.BUSINESS_CLASS_MULTIPLIER : 1.0m;

            db.TrainTickets.Add(generatedTicket);
            db.SaveChanges();

            return SendPurchaseConfirmationEmail(generatedTicket.Id);
        }