public ActionResult UserDisplayPuzzles(int id, PuzzleSortType? sortType, int? page, int? pageSize)
        {
            var urlHelper = new UrlHelper(new RequestContext(HttpContext, RouteData), RouteTable.Routes);
            var url = urlHelper.Action("UserDisplayPuzzles", "Players", new RouteValueDictionary { { "id", id }, { "sortType", sortType }, { "page", page }, { "pageSize", pageSize } },
                             "http", "wikipediamaze.com");

            return new PermanentRedirectResult(url);
        }
 public PuzzleListViewModel(string pageTitle, IPagination<PuzzleDetailView> paginatedPuzzles, PuzzleSortType sortType, bool isLoggedIn, int currentUserId)
 {
     PaginatedPuzzles = paginatedPuzzles;
     SortType = sortType;
     IsLoggedIn = isLoggedIn;
     _pageTitle = pageTitle;
     CurrentUserId = currentUserId;
 }
        public ActionResult Index(HeaderInfoController headerInfoController, SidebarController sidebarController, PuzzleSortType? sortType, int? page, int? pageSize)
        {
            sortType = sortType ?? PuzzleSortType.Newest;
            page = page ?? 1;
            pageSize = pageSize ?? 15;

            //Get sorted puzzles
            var puzzles = _puzzleService.GetPuzzleDetailView(sortType.Value, page.Value, pageSize.Value);

            var viewModel = new PuzzleListViewModel("Welcome", puzzles, sortType.Value, _authenticationService.IsAuthenticated, _authenticationService.CurrentUserId);

            return View(viewModel);
        }
        public ActionResult Display(HeaderInfoController headerInfoController, int id, string userName, PuzzleSortType? sortType, int? page, int? pageSize)
        {
            sortType = sortType ?? PuzzleSortType.Newest;
            page = page ?? 1;
            pageSize = pageSize ?? 10;

            var user = _accountService.GetUserById(id);

            if (user == null)
                return View("NotFound");

            var loggedInUserId = _authenticationService.CurrentUserId;
            var lastActivity = _accountService.GetLastActivityDate(user.Id);
            var profileVM = new UserProfileViewModel(user, loggedInUserId, lastActivity);

            return View("Display", profileVM);
        }
        private static string GetThemedPageTitle(PuzzleSortType sortType, IEnumerable<string> themes)
        {
            var sb = new StringBuilder();
            switch (sortType)
            {
                case PuzzleSortType.Level:
                    sb.Append("Hardest");
                    break;
                case PuzzleSortType.Newest:
                    sb.Append("Newest");
                    break;
                case PuzzleSortType.Solutions:
                    sb.Append("Most Played");
                    break;
                case PuzzleSortType.Votes:
                    sb.Append("Highest Voted");
                    break;
                default:
                    throw new NotImplementedException("Need to handle sorting for type {0}".ToFormat(sortType));
            }
            sb.Append(" Puzzles Themed ");
            foreach (var theme in themes)
            {
                sb.AppendFormat("{0}, ", theme);
            }

            return sb.ToString().Trim(' ', ',');
        }
 private static string GetPageTitle(PuzzleSortType sortType)
 {
     switch (sortType)
     {
         case PuzzleSortType.Level:
             return "Hardest Puzzles";
         case PuzzleSortType.Newest:
             return "Newest Puzzles";
         case PuzzleSortType.Solutions:
             return "Most Played Puzzles";
         case PuzzleSortType.Votes:
             return "Highest Voted Puzzles";
         default:
             throw new NotImplementedException("Need to handle sorting for type {0}".ToFormat(sortType));
     }
 }
        public ActionResult Themed(HeaderInfoController headerInfoController, SidebarController sidebarController, string themes, PuzzleSortType? sortType, int? page, int? pageSize)
        {
            sortType = sortType ?? PuzzleSortType.Newest;
            page = page ?? 1;
            pageSize = pageSize ?? 15;

            //Get sorted puzzles
            var themeList = Theme.GetThemesFromString(themes);
            IPagination<PuzzleDetailView> puzzles = _puzzleService.GetPuzzleDetailView(sortType.Value, page.Value, pageSize.Value, themeList);

            var viewModel = new PuzzleListViewModel(GetThemedPageTitle(sortType.Value, themeList), puzzles, sortType.Value, _authenticationService.IsAuthenticated, _authenticationService.CurrentUserId) {Themes = themeList};

            ViewData["themes"] = themes;
            return View(viewModel);
        }
        /// <summary>
        /// Displays the puzzles
        /// </summary>
        /// <param name="id">The id of the user who's profile is being displayed.</param>
        /// <param name="sortType">The id of the user who's profile is being displayed</param>
        /// <param name="page">The page number to show</param>
        /// <param name="pageSize">The size of the page to return.</param>
        public ActionResult PuzzleList(PuzzleSortType? sortType, int? page, int? pageSize)
        {
            sortType = sortType ?? PuzzleSortType.Newest;
            page = page ?? 1;
            pageSize = pageSize ?? 15;

            //Get sorted puzzles
            var puzzles = _puzzleService.GetPuzzleDetailView(sortType.Value, page.Value, pageSize.Value);

            var viewModel = new PuzzleListViewModel(GetPageTitle(sortType.Value), puzzles, sortType.Value, _authenticationService.IsAuthenticated, _authenticationService.CurrentUserId);

            return PartialView(viewModel);
        }
        public IPagination<Puzzle> GetPuzzlesByUserId(int userId, PuzzleSortType sort, int page, int pageSize)
        {
            pageSize = Math.Min(pageSize, Settings.DefualtPageSize);

            IQueryable<Puzzle> puzzles;
            using (_repository.OpenSession())
            {
                switch (sort)
                {
                    case PuzzleSortType.Newest:
                        puzzles = _repository.All<Puzzle>().Where(x => x.User.Id == userId).OrderByDescending(p => p.DateCreated).Skip((page - 1) * pageSize).Take(pageSize);
                        break;
                    case PuzzleSortType.Solutions:
                        puzzles = _repository.All<Puzzle>().Where(x => x.User.Id == userId).OrderByDescending(p => p.SolutionCount).Skip((page - 1) * pageSize).Take(pageSize);
                        break;
                    case PuzzleSortType.Level:
                        puzzles = _repository.All<Puzzle>().Where(x => x.User.Id == userId).OrderByDescending(p => p.Level).Skip((page - 1) * pageSize).Take(pageSize);
                        break;
                    case PuzzleSortType.Votes:
                        puzzles = _repository.All<Puzzle>().Where(x => x.User.Id == userId).OrderByDescending(p => p.VoteCount).Skip((page - 1) * pageSize).Take(pageSize);
                        break;
                    default:
                        throw new ArgumentOutOfRangeException("sort");
                }
                return new CustomPagination<Puzzle>(puzzles.ToList(), page, pageSize, _repository.All<Puzzle>().Where(x => x.User.Id == userId).Count());
            }
        }
        public IPagination<Puzzle> GetPuzzlesByTheme(string theme, PuzzleSortType sort, int? page, int? pageSize)
        {
            page = page ?? 1;
            pageSize = pageSize ?? Settings.DefualtPageSize;

            switch (sort)
            {
                case PuzzleSortType.Newest:
                    return _repository.All<Puzzle>().Where(x => x.IsVerified).Where(x => x.StartTopic.Equals(theme, StringComparison.InvariantCulture) || x.EndTopic.Equals(theme, StringComparison.InvariantCulture)).OrderByDescending(p => p.DateCreated).AsPagination(page.Value, pageSize.Value);
                case PuzzleSortType.Solutions:
                    return _repository.All<Puzzle>().Where(x => x.IsVerified).Where(x => x.StartTopic.Equals(theme, StringComparison.InvariantCulture) || x.EndTopic.Equals(theme, StringComparison.InvariantCulture)).OrderByDescending(p => p.SolutionCount).AsPagination(page.Value, pageSize.Value);
                case PuzzleSortType.Level:
                    return _repository.All<Puzzle>().Where(x => x.IsVerified).Where(x => x.StartTopic.Equals(theme, StringComparison.InvariantCulture) || x.EndTopic.Equals(theme, StringComparison.InvariantCulture)).OrderByDescending(p => p.Level).AsPagination(page.Value, pageSize.Value);
                case PuzzleSortType.Votes:
                    return _repository.All<Puzzle>().Where(x => x.IsVerified).Where(x => x.StartTopic.Equals(theme, StringComparison.InvariantCulture) || x.EndTopic.Equals(theme, StringComparison.InvariantCulture)).OrderByDescending(p => p.VoteCount).AsPagination(page.Value, pageSize.Value);
                default:
                    throw new ArgumentOutOfRangeException("sort");
            }
        }
        public IPagination<Puzzle> GetPuzzles(PuzzleSortType sort, int page, int pageSize, IEnumerable<string> themes)
        {
            using (_repository.OpenSession())
            {
                IList<Puzzle> puzzles = new List<Puzzle>();

                foreach (var theme in themes)
                {
                    var currentTheme = theme;
                    var themedPuzzles = _repository.All<PuzzleTheme>().Where(x => x.Theme.Equals(currentTheme, StringComparison.OrdinalIgnoreCase) && x.Puzzle.IsVerified).Select(x => x.Puzzle).ToList();
                    if (themedPuzzles.Count > 0)
                        puzzles.AddRange(themedPuzzles);
                }

                puzzles = puzzles.Distinct(Puzzle.Comparers.IdComparer).ToList();

                switch (sort)
                {
                    case PuzzleSortType.Newest:
                        puzzles = puzzles.Where(x => x.IsVerified).OrderByDescending(p => p.DateCreated).ToList();
                        break;
                    case PuzzleSortType.Solutions:
                        puzzles = puzzles.Where(x => x.IsVerified).OrderByDescending(p => p.SolutionCount).ToList();
                        break;
                    case PuzzleSortType.Level:
                        puzzles = puzzles.Where(x => x.IsVerified).OrderByDescending(p => p.Level).ToList();
                        break;
                    case PuzzleSortType.Votes:
                        puzzles = puzzles.Where(x => x.IsVerified).OrderByDescending(p => p.VoteCount).ToList();
                        break;
                    default:
                        throw new ArgumentOutOfRangeException("sort");
                }
                return new CustomPagination<Puzzle>(puzzles.Skip((page - 1) * pageSize).Take(pageSize), page, pageSize, puzzles.Count());
            }
        }
        /// <summary>
        /// Returns a collection of puzzles
        /// </summary>
        /// <param name="sort">The type of sort to apply to the collection.</param>
        /// <param name="page">The page number of the collection to return. The default is 1.</param>
        /// <param name="pageSize">The number of puzzles to return in each page.</param>
        public IPagination<Puzzle> GetPuzzles(PuzzleSortType sort, int page, int pageSize)
        {
            using (_repository.OpenSession())
            {
                IEnumerable<Puzzle> puzzles;

                switch (sort)
                {
                    case PuzzleSortType.Newest:
                       puzzles = _repository.All<Puzzle>().Where(x => x.IsVerified).OrderByDescending(p => p.DateCreated).Skip((page - 1) * pageSize).Take(pageSize).ToList();
                       break;
                    case PuzzleSortType.Solutions:
                       puzzles = _repository.All<Puzzle>().Where(x => x.IsVerified).OrderByDescending(p => p.SolutionCount).Skip((page - 1) * pageSize).Take(pageSize).ToList();
                       break;
                    case PuzzleSortType.Level:
                       puzzles = _repository.All<Puzzle>().Where(x => x.IsVerified).OrderByDescending(p => p.Level).Skip((page - 1) * pageSize).Take(pageSize).ToList();
                       break;
                    case PuzzleSortType.Votes:
                       puzzles = _repository.All<Puzzle>().Where(x => x.IsVerified).OrderByDescending(p => p.VoteCount).Skip((page - 1) * pageSize).Take(pageSize).ToList();
                       break;
                    default:
                        throw new ArgumentOutOfRangeException("sort");
                }
                return new CustomPagination<Puzzle>(puzzles, page, pageSize, _repository.All<Puzzle>().Where(x => x.IsVerified).Count());
            }
        }
        public IPagination<PuzzleDetailView> GetPuzzleDetailView(PuzzleSortType sort, int page, int pageSize, IEnumerable<string> themes)
        {
            using (_repository.OpenSession())
            {
                IList<PuzzleDetailView> puzzles = new List<PuzzleDetailView>();

                foreach (var theme in themes)
                {
                    var currentTheme = theme;
                    puzzles.AddRange(_repository.All<PuzzleDetailView>().Where(x => x.Themes.Contains(theme)).ToList());
                }

                puzzles = puzzles.Distinct(PuzzleDetailView.Comparers.PuzzleIdComparer).ToList();

                switch (sort)
                {
                    case PuzzleSortType.Newest:
                        puzzles = puzzles.Where(x => x.IsVerified).OrderByDescending(p => p.DateCreated).ToList();
                        break;
                    case PuzzleSortType.Solutions:
                        puzzles = puzzles.Where(x => x.IsVerified).OrderByDescending(p => p.SolutionCount).ToList();
                        break;
                    case PuzzleSortType.Level:
                        puzzles = puzzles.Where(x => x.IsVerified).OrderByDescending(p => p.Level).ToList();
                        break;
                    case PuzzleSortType.Votes:
                        puzzles = puzzles.Where(x => x.IsVerified).OrderByDescending(p => p.VoteCount).ToList();
                        break;
                    default:
                        throw new ArgumentOutOfRangeException("sort");
                }
                return new CustomPagination<PuzzleDetailView>(puzzles.Skip((page - 1) * pageSize).Take(pageSize), page, pageSize, puzzles.Count());
            }
        }
 public UserProfilePuzzleListViewModel(IPagination<UserProfilePuzzleViewModel> puzzles, PuzzleSortType sortType, int profileId)
 {
     Puzzles = puzzles;
     SortType = sortType;
     ProfileId = profileId;
 }
        /// <summary>
        /// Displays the puzzles on the user profile page.
        /// </summary>
        /// <param name="id">The id of the user who's profile is being displayed.</param>
        /// <param name="sortType">The id of the user who's profile is being displayed</param>
        /// <param name="page">The page number to show</param>
        /// <param name="pageSize">The size of the page to return.</param>
        public ActionResult UserDisplayPuzzles(int id, PuzzleSortType? sortType, int? page, int? pageSize)
        {
            sortType = sortType ?? PuzzleSortType.Newest;
            page = page ?? 1;
            pageSize = pageSize ?? 10;

            var loggedInUserId = _authenticationService.CurrentUserId;
            var user = _accountService.GetUserById(id);

            if (user == null)
                return View("NotFound");

            var puzzles = _puzzleService.GetPuzzlesByUserId(id, sortType.Value, page.Value, pageSize.Value);
            var votes = _puzzleService.GetVotes(puzzles, loggedInUserId);

            var puzzleVms = new List<UserProfilePuzzleViewModel>();
            foreach (var puzzle in puzzles)
            {
                var puzzleId = puzzle.Id;
                var userVote = votes.Where(x => x.UserId == loggedInUserId && x.PuzzleId == puzzleId).SingleOrDefault();
                var userVoteType = userVote == null ? VoteType.None : userVote.VoteType;
                puzzleVms.Add(new UserProfilePuzzleViewModel(puzzle, userVoteType, _authenticationService.IsAuthenticated, loggedInUserId));
            }

            var userProfilePuzzleVMs = new CustomPagination<UserProfilePuzzleViewModel>(puzzleVms, puzzles.PageNumber, puzzles.PageSize, puzzles.TotalItems);

            return PartialView(new UserProfilePuzzleListViewModel(userProfilePuzzleVMs, sortType.Value, user.Id));
        }