private async Task CreateCertificate(int courseId, string trainerId, StudentCourseGradeFormModel model)
        {
            if (this.certificateService.IsGradeEligibleForCertificate(model.GradeBg))
            {
                var success = await this.certificateService.CreateAsync(trainerId, courseId, model.StudentId, model.GradeBg.Value);

                if (success)
                {
                    this.TempData.AddSuccessMessage(WebConstants.ExamAssessedMsg + Environment.NewLine + WebConstants.CertificateIssuedMsg);
                }
            }
        }
        public async Task <IActionResult> EvaluateExam(int id, StudentCourseGradeFormModel model)
        {
            var courseExists = this.courseService.Exists(id);

            if (!courseExists)
            {
                this.TempData.AddErrorMessage(WebConstants.CourseNotFoundMsg);
                return(this.RedirectToAction(nameof(Courses)));
            }

            if (!this.ModelState.IsValid)
            {
                this.TempData.AddErrorMessage(WebConstants.GradeInvalidMsg);
                return(this.RedirectToTrainerStudentsForCourse(id));
            }

            var userId = this.userManager.GetUserId(this.User);

            if (userId == null)
            {
                this.TempData.AddErrorMessage(WebConstants.InvalidUserMsg);
                return(this.RedirectToAction(nameof(Courses)));
            }

            var isTrainer = await this.trainerService.IsTrainerForCourseAsync(userId, id);

            if (!isTrainer)
            {
                this.TempData.AddErrorMessage(WebConstants.NotTrainerForCourseMsg);
                return(this.RedirectToAction(nameof(Courses)));
            }

            var courseHasEnded = await this.trainerService.CourseHasEndedAsync(id);

            if (!courseHasEnded)
            {
                this.TempData.AddErrorMessage(WebConstants.CourseHasNotEndedMsg);
                return(this.RedirectToTrainerStudentsForCourse(id));
            }

            var isStudentInCourse = await this.courseService.IsUserEnrolledInCourseAsync(model.CourseId, model.StudentId);

            if (!isStudentInCourse)
            {
                this.TempData.AddErrorMessage(WebConstants.StudentNotEnrolledInCourseMsg);
                return(this.RedirectToTrainerStudentsForCourse(id));
            }

            var gradeValue = model.GradeBg.Value;
            var success    = await this.examService.EvaluateAsync(userId, id, model.StudentId, gradeValue);

            if (!success)
            {
                this.TempData.AddErrorMessage(WebConstants.ExamAssessmentErrorMsg);
                return(this.RedirectToTrainerStudentsForCourse(id));
            }

            this.TempData.AddSuccessMessage(WebConstants.ExamAssessedMsg);
            await this.CreateCertificate(id, userId, model);

            return(this.RedirectToTrainerStudentsForCourse(id));
        }