public Reservation MakeReservation(ReservationRequest request) { var freeSeats = _seatService.GetAvailableSeats(request.TrainId); if (!CanFillTrainWith(request.SeatCount, freeSeats.Count)) { return(null); } var orderedSeats = freeSeats.OrderBy(x => x.Coach).ThenBy(x => x.SeatNumber).ToList(); var reservedSeats = new List <Seat>(); var coachs = orderedSeats.GroupBy(x => x.Coach); foreach (var seat in coachs) { if (SeatsInCoachAreAvailable(request.SeatCount, seat.Count())) { reservedSeats = seat.ToList().GetRange(0, request.SeatCount); _seatService.ConfirmReservation(reservedSeats); return(new Reservation(request.TrainId, _bookingService.GetBookingId(), reservedSeats)); } } return(null); }