public ActionResult UpdateStudent()
        {
            // await ParseUser.LogInAsync("*****@*****.**", "123456");
            ParseUser user = Session.GetLoggedInUser();
            StudentDetailsViewModel model = new StudentDetailsViewModel();
            ViewBag.IsAdmin = (user != null && !string.IsNullOrEmpty(Session.GetImpersonatingUserName())) || Session.GetLoggedInUserRoleName() == RoleNames.ADMINISTRATORS;

            if (user == null) return RedirectToAction("Login");

            var repository = new ParseRepository(new WebCacheProvider(HttpContext.ApplicationInstance.Context));
            var worldContentTypeRetriever = new WorldContentTypeRetriver(HttpContext, repository);
            var contentTypes =  worldContentTypeRetriever.GetContentTypes(user, Session.GetLoggedInUserRoleName());
            var currencies = repository.FindCurrencies();
            var uiLanguages =  repository.FindInterfaceLanguages();
            IEnumerable<UserGroup> groups = ( repository.FindGroups()).ToArray();
            IEnumerable<UserGroup> subGroups = ( repository.FindSubGroups()).ToArray();
            var sugLessonPublishingStatus = repository.FindUserPublishingStatus();
            var userStatuses = repository.FindUserStatus();

            model.DeviceTypes =  repository.FindDeviceTypes();
            model.Countries = repository.FindCountries();
            model.UserPrefferences.ContentTypes = contentTypes;
            model.UserPrefferences.Currencies = currencies;
            model.UserPrefferences.Languages = uiLanguages;
            model.Groups = groups;
            model.SubGroups = subGroups;
            model.SugLessonPublishingStatus = sugLessonPublishingStatus;
            model.UserStatusValues = userStatuses;

            model.FirstName = user.GetString("firstName_he_il");// user.Keys.Contains("firstName") ? user["firstName"] as string : string.Empty;
            model.LastName = user.GetString("lastName_he_il");// user.Keys.Contains("lastName") ? user["lastName"] as string : string.Empty;
            model.Email = user.Keys.Contains("email") ? user["email"] as string : string.Empty;
            model.Phone = user.Keys.Contains("phoneNumber") ? user["phoneNumber"] as string : string.Empty;
            model.Email = user.Keys.Contains("email") ? user["email"] as string : string.Empty;
            model.MailRecipientAddress = user.GetString("mailRecipientAddress");
            model.UserPrefferences.SelectedContentType = user.GetPointerObjectId("contentType");
                       
            model.UserPrefferences.SelectedCurrency = user.GetPointerObjectId("currency");
            model.UserPrefferences.SelectedLanguage = user.GetPointerObjectId("interfaceLanguage");
            
            model.CountryOfResidence = user.GetPointerObjectId("residenceCountry");

            model.SelectedDeviceType = user.Keys.Contains("deviceType") && (user["deviceType"] as ParseObject) != null ? (user["deviceType"] as ParseObject).FetchIfNeededAsync().Result.ObjectId : string.Empty;
            model.SelectedDeviceType = model.DeviceTypes.FirstOrDefault(deviceType => deviceType.Key.Split(new [] { '|' })[0] == model.SelectedDeviceType).Key;

            ViewBag.DeviceUnSupportedText =  Strings.GetLocalizedString(Strings.UnSupportedDevice);

            var userAdminData =  user.GetPointerObject<UserAdminData>("adminData");
            if (userAdminData != null)
            {
                model.AdminData.TCPTeacherCommission = userAdminData.TcpTeacherCommission.ToString("n2");
                model.AdminData.AgentUserName =userAdminData.Agent!=null? userAdminData.Agent.Username:string.Empty;
                model.AdminData.ACPAgentCommission = userAdminData.AcpTeacherCommission.ToString("n2");
                model.AdminData.STRCommissionRatio = userAdminData.StrCommissionRatio;
                model.AdminData.UserPublishingStatus = userAdminData.GetPointerObjectId("userPublishingStatus");
                model.AdminData.UserStatus = userAdminData.GetPointerObjectId("userStatus");
                model.AdminData.LockCountry = userAdminData.LockCountry;
                model.AdminData.LockCurrency = userAdminData.LockCurrency;
                model.AdminData.AdminRemarks = userAdminData.AdminRemarks;
                if (userAdminData.Group != null)
                {
                    var savedSelectedGroup = userAdminData.Group.ObjectId;
                    var selectedSubGroup = subGroups.SingleOrDefault(o => o.ObjectId == savedSelectedGroup);
                    var selectedGroup = groups.SingleOrDefault(o => o.ObjectId == savedSelectedGroup);
                    if (selectedSubGroup != null)
                    {
                        selectedGroup = groups.Single(o => o.ObjectId == selectedSubGroup.Parent.ObjectId);
                    }

                    model.AdminData.Group = selectedGroup != null ? selectedGroup.ObjectId : string.Empty;
                    model.AdminData.SubGroup = selectedSubGroup != null ? selectedSubGroup.ObjectId : string.Empty;
                }
            }

            model.Messages.CountryLocked = Strings.GetLocalizedString(Strings.CountryLocked);
            model.Messages.SugOsekLocked = Strings.GetLocalizedString(Strings.SugOsekLocked);
            model.Messages.CurrencyLocked = Strings.GetLocalizedString(Strings.CurrencyLocked);
            model.Messages.SugNirutLocked = Strings.GetLocalizedString(Strings.SugNirutLocked);
            model.Messages.AgentNotFound = Strings.GetLocalizedString(Strings.AgentNotFound);
            if (user.GetStatus() == UserStatusStrings.AppUser)
            {
                model.AppUserMessage = string.Format(MyMentorResources.appUserMoreDetails, user.GetFullName(Language.CurrentLanguageCode));
            }
            return View(model);
        }
        public async Task<ActionResult> UpdateStudent(StudentDetailsViewModel model)
        {
            var repository = RepositoryFactory.GetInstance(Session);
            try
            {
                var registerAsTeacher = model.RegisterAsTeacher;

                ViewBag.IsAdmin = (Session.GetLoggedInUser() != null && !string.IsNullOrEmpty(Session.GetImpersonatingUserName())) || Session.GetLoggedInUserRoleName() == RoleNames.ADMINISTRATORS;

                IEnumerable<UserGroup> groups = (repository.FindGroups()).ToArray();
                IEnumerable<UserGroup> subGroups = (repository.FindSubGroups()).ToArray();
                var sugLessonPublishingStatus = repository.FindUserPublishingStatus();
                var userStatuses = repository.FindUserStatus();
                var worldContentTypeRetriever = new WorldContentTypeRetriver(HttpContext, repository);
                
                model.UserRole = RoleNames.STUDENTS;
                model.DeviceTypes = repository.FindDeviceTypes();
                model.Countries = repository.FindCountries();

                model.UserPrefferences.ContentTypes = worldContentTypeRetriever.GetContentTypes(Session.GetLoggedInUser(), Session.GetImpersonatingUserName());
                model.UserPrefferences.Currencies = repository.FindCurrencies();
                model.UserPrefferences.Languages = repository.FindInterfaceLanguages();
                model.Groups = groups;
                model.SubGroups = subGroups;
                model.SugLessonPublishingStatus = sugLessonPublishingStatus;
                model.UserStatusValues = userStatuses;
               // var selectedCountry = model.Countries.FirstOrDefault(country => country.Key == model.CountryOfResidence);
               // model.CountryOfResidence = selectedCountry;
                try
                {
                    await new MyMentorUserManager(repository, Session).UpdateStudent(model);
                    model.UpdateSuccess = true;
                }
                catch (Exception ex)
                {
                    mLogger.Log(LogLevel.Error, ex.ToString);
                    model.UpdateSuccess = false;
                }

                if (model.UpdateSuccess != null)
                {
                    if (registerAsTeacher)
                    {
                        ViewBag.UpdateStudentMessage = model.UpdateSuccess.Value ?
                             Strings.GetLocalizedString(Strings.RegistrationSuccessStudentBucomesTeacher) :
                             Strings.GetLocalizedString(Strings.UpdateStudentFail);

                        if (model.UpdateSuccess.Value) ViewBag.UpdateStudentMessage = string.Format(ViewBag.UpdateStudentMessage, model.FirstName);
                    }
                    else
                    {
                        ViewBag.UpdateStudentMessage = model.UpdateSuccess.Value ?
                             Strings.GetLocalizedString(Strings.UpdateStudentSuccess) :
                             Strings.GetLocalizedString(Strings.UpdateStudentFail);
                    }

                }

                SetUserPrefferences(model.UserPrefferences);

                return View(model);
            }
            finally 
            {
                repository.Dispose();
            }
        }
        public ActionResult Update(string regAsTeacher = null)
        {
            var repository = RepositoryFactory.GetInstance(Session);
            try
            {
                ParseUser user = Session.GetLoggedInUser();
                ViewBag.IsAdmin = (user != null && !string.IsNullOrEmpty(Session.GetImpersonatingUserName())) || Session.GetLoggedInUserRoleName() == RoleNames.ADMINISTRATORS;

                if (user == null) return RedirectToAction("Login");

                var worldContentTypeRetriever = new WorldContentTypeRetriver(HttpContext, repository);
                var model = new UserDetailsViewModel();
                model.IsTeacher = user.GetBool("registerAsTeacher");

                if (!model.IsTeacher && regAsTeacher == null)
                {
                    return RedirectToAction("UpdateStudent");
                }

                user["registerAsTeacher"] = true;
                var residences = repository.FindAllResidences();
                var sugTavs = repository.FindSugTav();
                var sugTagmuls = repository.FindSugTagmul();
                var sugNirut = repository.FindSugNirut();
                var sugMehira = repository.FindSugMehira();
                var sugLanguages = repository.FindLanguages();
                var sugLessonPublishingStatus = repository.FindUserPublishingStatus();

                var userResidence = residences.FirstOrDefault(obj => obj.Name.Equals(user.GetString("residenceCountry")));
                var deviceTypes = repository.FindDeviceTypes();
                var contentTypes = worldContentTypeRetriever.GetContentTypes(user, Session.GetLoggedInUserRoleName());

                var currencies = repository.FindCurrencies();
                var uiLanguages = repository.FindInterfaceLanguages();
                var userStatuses = repository.FindUserStatus();
                IEnumerable<UserGroup> groups = (repository.FindGroups()).ToArray();
                IEnumerable<UserGroup> subGroups = (repository.FindSubGroups()).ToArray();
                var sugOseks = repository.FindAllSugOsek();

                model.SugTav = sugTavs;
                model.SaleStatus = sugMehira;
                model.SugTagmuls = sugTagmuls.ConvertToSugTagmul(userResidence != null && userResidence.Israel);
                model.SugNiruts = sugNirut;
                model.SugMehiras = sugMehira;
                model.SugLanguages = sugLanguages;
                model.SugLessonPublishingStatus = sugLessonPublishingStatus;

                model.Groups = groups;
                model.SubGroups = subGroups;
                model.DeviceTypes = deviceTypes;
                model.UserPrefferences.ContentTypes = contentTypes;
                model.UserPrefferences.Currencies = currencies;
                model.UserPrefferences.Languages = uiLanguages;
                model.UserStatusValues = userStatuses;
                model.SugOseks = sugOseks;

                model.SelectedSugTav = user.GetPointerObjectId("sugTav");
                model.Residence = user.GetPointerObjectId("residence");
                model.SelectedSugTagmul = user.GetPointerObjectId("sugTagmul");
                model.SelectedSugNirut = user.GetPointerObjectId("sugNirut");
                model.SelectedSugMehiras = user.GetPointerObjectId("sugMehira");
                model.TeachingLanguage1 = user.GetPointerObjectId("teachingLanguage1");
                model.TeachingLanguage2 = user.GetPointerObjectId("teachingLanguage2");
                model.TeachingLanguage3 = user.GetPointerObjectId("teachingLanguage3");
                model.UserPrefferences.SelectedContentType = user.GetPointerObjectId("contentType");
                model.UserPrefferences.SelectedCurrency = user.GetPointerObjectId("currency");
                model.UserPrefferences.SelectedLanguage = user.GetPointerObjectId("interfaceLanguage");
                model.SelectedSugOsek = user.GetPointerObjectId("sugOsek");
                //   model.SelectedUserStatus = currentUserStatus.ObjectId;

                model.FirstName = user.GetString("firstName_he_il").Trim();
                model.LastName = user.GetString("lastName_he_il").Trim();
                model.GovId = user.GetString("govId");
                model.FirstNameEnglish = user.GetString("firstName_en_us").Trim();
                model.LastNameEnglish = user.GetString("lastName_en_us").Trim();
                model.Email = user.GetString("email");
                model.Phone = user.GetString("phoneNumber");
                model.MailRecipientAddress = user.GetString("mailRecipientAddress");
                model.OtherTeachingLocation = user.GetString("otherTeachingLocation");
                model.TeachesFromYear = user.GetString("teachesFromYear");
                model.TeacherHomePage = user.GetString("teacherHomePage");
                model.CityOfResidence = user.GetString("cityOfResidence_he_il");
                model.CityOfResidence_en_us = user.GetString("cityOfResidence_en_us");
                model.SelectedSaleStatus = user.GetString("saleStatus");
                model.TeacherDescription = user.GetString("teacherDescription");
                model.TeacherDescriptionEnglish = user.GetString("teacherDescription_en_us");

                model.SelectedDeviceType = user.GetPointerObjectId("deviceType");
                model.SelectedDeviceType = model.DeviceTypes.FirstOrDefault(deviceType => deviceType.Key.Split(new char[] { '|' })[0] == model.SelectedDeviceType).Key;

                model.PaymentDetails.AccountNumber = user.GetString("bankAccountNumber");
                model.PaymentDetails.IRSNumber = user.GetString("irsFileNumber");
                model.PaymentDetails.VATNumber = user.GetString("vatFileNumber");
                model.PaymentDetails.BankName = user.GetString("bankName");
                model.PaymentDetails.BankBranch = user.GetString("bankBranch");
                model.PaymentDetails.BeneficiaryFulllName = user.GetString("beneficiaryFulllName");
                model.PaymentDetails.PayPalEmail = user.GetString("paypalEmail");

                model.LessonCost = user.GetNullableInt("lessonCost");
                model.ExtraFeeForStudentHouse = user.GetNullableInt("extraFeeForStudentHouse");

                model.Ashkenaz = user.GetBool("isAshkenazVersion");
                model.Morocco = user.GetBool("isMorocoVersion");
                model.Sefaradi = user.GetBool("isSepharadiVersion");
                model.Yemen = user.GetBool("isYemenVersion");
                model.OtherTeachingNosah = user.GetBool("isOtherTeachingNosah");

                model.TeachesAtHome = user.GetBool("teachesAtHome");
                model.TeachesAtStudentHouse = user.GetBool("teachesAtStudentHome");
                model.ShowContanctDetails = user.GetBool("showContactDetails");

                var userAdminData = user.GetPointerObject<UserAdminData>("adminData");
                var agentUser = userAdminData.GetPointerObject<ParseUser>("agent");
                if (userAdminData != null)
                {
                    model.AdminData.TCPTeacherCommission = userAdminData.TcpTeacherCommission.ToString("n2");
                    model.AdminData.AgentUserName = agentUser != null ? agentUser.Username : string.Empty;
                    model.AdminData.ACPAgentCommission = userAdminData.AcpTeacherCommission.ToString("n2");
                    model.AdminData.STRCommissionRatio = userAdminData.StrCommissionRatio;
                    model.AdminData.UserPublishingStatus = userAdminData.GetPointerObjectId("userPublishingStatus");
                    model.AdminData.UserStatus = userAdminData.GetPointerObjectId("userStatus");

                    model.AdminData.LockCountry = userAdminData.LockCountry;
                    model.AdminData.LockCurrency = userAdminData.LockCurrency;
                    model.AdminData.LockSugNirut = userAdminData.LockSugNirut;
                    model.AdminData.LockSugOsek = userAdminData.LockSugOsek;
                    model.AdminData.OriginalTaxPercent = userAdminData.OriginalTaxPercent;
                    model.AdminData.AdminRemarks = userAdminData.AdminRemarks;

                    if (userAdminData.Group != null)
                    {
                        var savedSelectedGroup = userAdminData.Group.ObjectId;
                        var selectedSubGroup = subGroups.SingleOrDefault(o => o.ObjectId == savedSelectedGroup);
                        var selectedGroup = groups.SingleOrDefault(o => o.ObjectId == savedSelectedGroup);
                        if (selectedSubGroup != null)
                        {
                            selectedGroup = groups.Single(o => o.ObjectId == selectedSubGroup.Parent.ObjectId);
                        }

                        model.AdminData.Group = selectedGroup != null ? selectedGroup.ObjectId : string.Empty;
                        model.AdminData.SubGroup = selectedSubGroup != null ? selectedSubGroup.ObjectId : string.Empty;
                    }
                }

                model.PictureUrl = user.Keys.Contains("picture") ? ((ParseFile)user["picture"]).Url.ToString() : MentorSystem.DEFAULT_PROFILE_IMAGE;
                var residenceTitle = residences.FirstOrDefault(residence => residence.Id == model.Residence);
                if (residenceTitle != null)
                    model.ResidenceTitle = !string.IsNullOrEmpty(model.Residence) ? residenceTitle.Name : string.Empty;

                var residenceCountry = GetResidenceCountry(residences, model.Residence);

                model.ResidenceCountry = residenceCountry.Name;
 
                ViewBag.DeviceUnSupportedText = Strings.GetLocalizedString(Strings.UnSupportedDevice);
                model.Messages.CountryLocked = Strings.GetLocalizedString(Strings.CountryLocked);
                model.Messages.SugOsekLocked = Strings.GetLocalizedString(Strings.SugOsekLocked);
                model.Messages.CurrencyLocked = Strings.GetLocalizedString(Strings.CurrencyLocked);
                model.Messages.SugNirutLocked = Strings.GetLocalizedString(Strings.SugNirutLocked);
                model.Messages.AgentNotFound = Strings.GetLocalizedString(Strings.AgentNotFound);
                return View("Update", model);
            }
            finally 
            {
                
                repository.Dispose();
            }
           
        }