public void CreateAssessmentSubmission(AssessmentSubmission submission, out Certificate certificate)
        {
            if (submission == null)
            {
                throw new ArgumentNullException(nameof(submission));
            }

            certificate = null;

            //TODO validation
            AssessmentRequest request = submission.AssessmentRequest ?? _assessmentRequests.GetById(submission.AssessmentRequestId);

            request.IsCompleted = true;
            _assessmentRequests.Update(request);
            _assessmentRequests.SaveChanges();

            submission.UserId = request.UserId;
            _assessmentSubmissions.Add(submission);
            _assessmentSubmissions.SaveChanges();

            Course submissionCourse = _courses.GetById(submission.CourseId);

            if (submission.IsSuccessful)
            {
                certificate = _certificatesService.GenerateCertificate(request.User.Username, submissionCourse.Id, submission);
                string certificateUrl        = _routeProvider.GetCertificateRoute(certificate);
                string certificatePictureUrl = _routeProvider.GetCertificatePictureRoute(certificate);
                _messageService.SendExamSuccessfulMessage(request.User, submissionCourse, certificateUrl, certificatePictureUrl);
            }
            else
            {
                string assessmentUrl = _routeProvider.GetAssessmentRoute(submissionCourse.Id);
                _taskRunner.Schedule <IMessageService>(x => x.SendExamAvailableMessage(request.User, submissionCourse, assessmentUrl), NextAvailableAssessmentAttempt(submission.CreatedOn));//TODO add config setting
            }
        }