public async Task<bool> UpdateCourse(CourseUpdateRequest request)
 {
     try
     {
         HttpResponseMessage httpResp = apiCom.executePutAPI("Course", JsonConvert.SerializeObject(request));
         if (httpResp.IsSuccessStatusCode)
         {
             return true;
         }
         else
         {
             return false;
         }
     }
     catch
     {
         return false;
     }
 }
        public async Task<ActionResult> Create(CreateCourseModel model)
        {
            if (ModelState.IsValid)
            {
                CourseAddRequest car = new CourseAddRequest()
                {
                    CourseCode = model.CourseCode,
                    CourseName = model.CourseName,
                    DesiredSkillSets = model.DesiredSkillSets,
                    GroupSize = model.GroupSize,
                    CourseDescription = model.CourseDescription,
                    PreferSimiliarSkillSet = model.PreferSimiliarSkillSet,
                    userList = new List<CourseNewUser>()
                };
                switch(model.GroupType)
                {
                    case "Study Group":
                        car.GroupType = "Study";
                        break;
                    case "Project Group (Open Projects)":
                        car.GroupType = "OpenProject";
                        break;
                    case "Project Group (Closed Projects)":
                        car.GroupType = "ClosedProject";
                        break;
                }

                if(model.Users != null && model.Users.Count > 0)
                {
                    foreach(var user in model.Users)
                    {
                        car.userList.Add(new CourseNewUser()
                        {
                            emailId = user.emailId,
                            roleCode = user.role.ToString()
                        });
                    }
                }
                
                bool result = _courseCom.AddCourse(car).Result;
                if (result) //Course is added, now generate intelligent question set and add questionnaire
                {
                    QuestionnaireAddRequest qar = new QuestionnaireAddRequest()
                    {
                         IsATemplate = false,
                         QuestionnaireCode = DateTime.UtcNow.ToString("MMddyyHmmss"),
                         Questions = new List<DomainDto.Question>()
                    };
                    List<string> timeZones = TimeZoneInfo.GetSystemTimeZones().Select(x => x.DisplayName).ToList();
                    qar.Questions.Add(new DomainDto.Question()
                    {
                         questionText = "In what timezone are you mostly available?",
                         questionType = "MultipleChoice",
                         answerChoices = timeZones
                    });
                    List<string> timeSlots = new List<string>()
                    {
                        "6:00 AM - 9:00 AM",
                        "9:00 AM - 12:00 PM",
                        "12:00 PM - 3:00 PM",
                        "3:00 PM - 6:00 PM",
                        "6:00 PM - 9:00 PM",
                        "9:00 PM - 12:00 AM",
                        "Anytime",
                        "I am not available"

                    };
                    qar.Questions.Add(new DomainDto.Question()
                    {
                        questionText = "During weekday, what time are you available for group calls?",
                        questionType = "MultipleChoice",
                        answerChoices = timeSlots
                    });
                    qar.Questions.Add(new DomainDto.Question()
                    {
                        questionText = "During weekends, what time are you available for group calls?",
                        questionType = "MultipleChoice",
                        answerChoices = timeSlots
                    });

                    if(model.GenerateIntelligentQuestionnaire)
                    {
                        if(model.DesiredSkillSets != null)
                        {
                            foreach(var skl in model.DesiredSkillSets.Split(','))
                            {
                                qar.Questions.Add(new DomainDto.Question()
                                    {
                                        questionText = "What is your expertise in " + skl,
                                        questionType = "MultipleChoice",
                                        answerChoices = new List<string>() { "Beginner", "Intermediate", "Expert"}
                                    });
                            }
                        }
                    }

                    if(model.Questions != null && model.Questions.Count > 0)
                    {
                        foreach(var q in model.Questions)
                        {
                            qar.Questions.Add(new DomainDto.Question()
                                {
                                    questionType = q.QuestionType,
                                    questionText  = q.QuestionText,
                                    answerChoices = q.AnswerChoices.Split(',').ToList()
                                });
                        }
                    }
                    bool res = _questionnaireCom.AddQuestionnaire(qar).Result;
                    if(res)//Questionnaire is added, update course with questionnaire
                    {
                        CourseUpdateRequest cur = new CourseUpdateRequest()
                        {
                            CourseCode = model.CourseCode,
                            QuestionnaireCode = qar.QuestionnaireCode
                        };
                        bool resp = _courseCom.UpdateCourse(cur).Result;
                        if(!resp)
                        {
                            ModelState.AddModelError("", "Oops! Course was added, but someting wrong happened while adding questionnaire to course");
                            return View(model);
                        }
                    }
                    MvcApplication.courses.Add(model.CourseCode, model.CourseName);
                    MvcApplication.courseDescription.Add(model.CourseCode, model.CourseDescription);
                    return RedirectToAction("Teacher", "Course");
                }
            }
            ModelState.AddModelError("", "Oops! Something wrong happened! Please try again.");
            return View(model);
        }
        public DomainModelResponse Update(CourseUpdateRequest request)
        {
            Course course = _repCourse.Get(filter: f => f.CourseCode == request.CourseCode).FirstOrDefault();
            bool updateCourse = false;
            if(request.CourseName != null) //Course name update
            {
                course.CourseName = request.CourseName;
                updateCourse = true;
            }
            if (request.CourseDescription != null)
            {
                course.CourseDescription = request.CourseDescription;
                updateCourse = true;
            }

            if(request.QuestionnaireCode != null)
            {
                EntityModel.Questionnaire questionnaire = _repQuestionnaire.Get(filter: f => f.QuestionnaireCode == request.QuestionnaireCode).FirstOrDefault();
                course.QuestionnaireId = questionnaire.QuestionnaireId;
                course.Questionnaire = questionnaire;
                updateCourse = true;
            }

            if(updateCourse)
                _repCourse.Update(course);

            if(request.CourseNewUsers != null)
            {
                List<string> roleCodes = request.CourseNewUsers.Select(x => x.roleCode).ToList();
                List<string> emailIds = request.CourseNewUsers.Select(x => x.emailId).ToList();

                List<EntityModel.Role> roles = _repRole.Get(filter: f => roleCodes.Contains(f.RoleCode)).ToList();
                List<UserProfile> userProfiles = _repUserProfile.Get(filter: f => emailIds.Contains(f.EmailId)).ToList();

                foreach (var user in request.CourseNewUsers)
                {
                    CourseUserRole cur = new CourseUserRole()
                    {
                        CourseId = course.CourseId,
                        Course = course,
                        Role = roles.Where(x => x.RoleCode == user.roleCode).FirstOrDefault(),
                        RoleId = roles.Where(x => x.RoleCode == user.roleCode).FirstOrDefault().RoleId,
                        UserId = userProfiles.Where(x => x.EmailId == user.emailId).FirstOrDefault().UserId,
                        UserProfile = userProfiles.Where(x => x.EmailId == user.emailId).FirstOrDefault(),
                        LastChangedTime = DateTime.UtcNow
                    };
                    _repCourseUserRole.Add(cur);
                }
            }

            if (request.CourseDeleteUsers != null)
            {
                List<string> roleCodes = request.CourseDeleteUsers.Select(x => x.roleCode).ToList();
                List<string> emailIds = request.CourseDeleteUsers.Select(x => x.emailId).ToList();

                List<EntityModel.Role> roles = _repRole.Get(filter: f => roleCodes.Contains(f.RoleCode)).ToList();
                List<UserProfile> userProfiles = _repUserProfile.Get(filter: f => emailIds.Contains(f.EmailId)).ToList();

                foreach (var user in request.CourseDeleteUsers)
                {
                    int RoleId = roles.Where(x => x.RoleCode == user.roleCode).FirstOrDefault().RoleId;
                    int UserId = userProfiles.Where(x => x.EmailId == user.emailId).FirstOrDefault().UserId;

                    CourseUserRole cur = _repCourseUserRole.Get(filter: f => f.RoleId == RoleId && f.CourseId == course.CourseId && f.UserId == UserId).FirstOrDefault();
                    _repCourseUserRole.Delete(cur);
                }
            }

            _uow.Commit();
            _courseResponse.addResponse("Update", MessageCodes.InfoSavedSuccessfully, "Course : " + request.CourseCode);
            return _courseResponse;
        }