//
        // GET: /MyAccount/
        public async Task<ActionResult> Index(MyAccountRequest request)
        {

            using (IMyMentorRepository repository = RepositoryFactory.GetInstance(Session))
            {
                await MyMentorUserManager.LoginWithAuthCookie(Session, HttpContext, repository);

                var user = Session.GetLoggedInUser();
                if (user == null) return RedirectToAction("login", "Account");
                if (user.GetStatus() == UserStatusStrings.AppUser) return RedirectToAction("UpdateStudent", "Account");
                
                var model = await GetMyAccountVm(request, repository);
                SetDates(model);
                request.Asc = request.Asc.HasValue ? request.Asc : true;

                var entities = repository.FindEntities().ToArray();
                var eventTypes = repository.FindEventTypes().ToArray();
                var transactionTypes = repository.FindAllTransactionTypes().ToArray();
                var couponTypes = repository.FindCouponTypes();
                var supportTypes = repository.FindSupportTypes();
                var couponStatuses = repository.FindCouponStatus();
                var pageCount = 0;
                var nisCurrencySymbol = repository.FindDefaultCurrency().CurrencySymbol;

                if (string.IsNullOrEmpty(request.Eid))
                {                    
                    var accountStatements =repository.FindAccountStatementsForUser(request, out pageCount).ToArray();
                    var purchaseStatuses = repository.FindPurchaseStatues().ToArray();
                    var clipStatuses = repository.FindClipStatuses();
                    var events = accountStatements.Select(x => x.Event);
                    var purchases = repository.FindPurchasesByEvents(events);
                    model.AccountStatements = GetAccountStatements(accountStatements, entities, eventTypes, transactionTypes, couponTypes, supportTypes, couponStatuses, nisCurrencySymbol, purchases, clipStatuses, purchaseStatuses);
                    if (accountStatements.Any())
                    {
                        var accountStatement = accountStatements.First();
                        model.PrevBalance = accountStatement.PrevBalance.ToCurrency(accountStatement.Currency.CurrencySymbol);
                        model.PrevBalanceNis = accountStatement.PrevBalanceNIS.ToCurrency(nisCurrencySymbol);
                    }
                }
                else
                {
                    model.AccountStatements = GetStatementsByEventId(request.Eid, repository, entities, couponStatuses, eventTypes, transactionTypes, couponTypes, supportTypes, nisCurrencySymbol);
                }
                model.PageCount = pageCount;
                model.ShowAdminView = Session.GetLoggedInUserRoleName() == RoleNames.ADMINISTRATORS || !string.IsNullOrEmpty(Session.GetImpersonatingUserName());
                return View("index", model);
            }
        }
        private async Task<MyAccountViewModel> GetMyAccountVm(MyAccountRequest request, IMyMentorRepository repository)
        {                        
            var model = new MyAccountViewModel {MyAccountRequest = request};
            var isAdmin = Session.GetLoggedInUserRoleName() == RoleNames.ADMINISTRATORS || !string.IsNullOrEmpty(Session.GetImpersonatingUserName());
            var currentUser = Session.GetLoggedInUser();
            var isFirstTimeInPage = Request.QueryString.AllKeys.All(x => x.ToLower() != "uid" && x.ToLower() != "pn");
            var userManager = new MyMentorUserManager(repository, Session, HttpContext);

            if (isAdmin && currentUser.Username != request.Uid && !isFirstTimeInPage)
            {
                if (!string.IsNullOrEmpty(request.Uid))
                {
                    var user = await repository.FindUserByUserName(request.Uid);
                    if (user != null)
                    {
                        model.ErrorMessage = string.Empty;
                        model.UserName = user.UserName;
                        model.UserDispalyName =string.Concat(user.GetLocalizedField("FirstName") ," ", user.GetLocalizedField("LastName"));
                        model.MyAccountRequest.Uid = user.ObjectId;

                        if (Session.GetImpersonatingUserName() != model.UserName)
                            await userManager.ImpersonateUser(user.UserName);
                        else
                            userManager.StopImpersonation();
                    }
                    else
                    {
                        model.ErrorMessage = MyMentorResources.userNameDoesNotExist;
                    }
                }
                else
                {
                    userManager.StopImpersonation();
                }
            }
            else
            {
                model.UserName = currentUser.Username;
                model.UserDispalyName = currentUser.GetFullName(Language.CurrentLanguageCode);
                model.MyAccountRequest.Uid = currentUser.ObjectId;
            }

            return model;
        }