public IHttpActionResult GetByPage(int page)
        {
            // TODO: refactor extract method
            var currentUserId = this.User.Identity.GetUserId();
            var currentUser = this.data
              .Users
              .All()
              .Where(x => x.Id == currentUserId)
              .FirstOrDefault();

            if (currentUser == null)
            {
                return GetUnauthenticatedGamesByPage(page);
            }

            // TODO: refactor this

            var ownGames = currentUser.Games
                .Where(g => g.State != GameState.WonByBlue && g.State != GameState.WonByRed)
                .OrderBy(g => g.State)
                .ThenBy(g => g.Name)
                .ThenBy(g => g.DateCreated)
                .ThenBy(g => g.RedPlayer.UserName)
                .Take(DefaultGamesCount)
                .ToList();

            var modelled = ownGames.Select(g => new GameModel
                {
                    Red = g.RedPlayer.UserName,
                    DateCreated = g.DateCreated,
                    GameState = g.State.ToString(),
                    Id = g.Id,
                    Name = g.Name,
                })
                .ToList();


            if (modelled.Count == DefaultGamesCount)
            {
                return Ok(modelled);
            }
            else
            {
                int countOfOtherGames = DefaultGamesCount - modelled.Count;
                var otherGames = this.data.Games
                    .All()
                    .Where(g => g.RedPlayerId.ToString() != currentUserId &&
                        g.BluePlayerId.ToString() != currentUserId &&
                        g.State != GameState.WonByBlue &&
                        g.State != GameState.WonByRed)
                    .OrderBy(g => g.State)
                    .ThenBy(g => g.Name)
                    .ThenBy(g => g.DateCreated)
                    .ThenBy(g => g.RedPlayer.UserName)
                    .Take(countOfOtherGames)
                    .ToList();


                var modelledOther = new List<GameModel>();
                foreach (var g in otherGames)
                {
                    if (ownGames.Contains(g))
                    {
                        continue;
                    }

                    var user = g.RedPlayer != null ? g.RedPlayer.UserName : null;
                    var mod = new GameModel()
                    {
                        DateCreated = g.DateCreated,
                        GameState = g.State.ToString(),
                        Id = g.Id,
                        Name = g.Name,
                        Red = user,
                    };

                    modelledOther.Add(mod);
                }

                var result = modelled.Concat(modelledOther);
                return Ok(result);
            }

        }
        public IHttpActionResult Join(GameModel guess)
        {
            if (!ModelState.IsValidField("number"))
            {
                return BadRequest();
            }

            // TODO: refactor extract method
            var currentUserId = this.User.Identity.GetUserId();
            var currentUser = this.data
              .Users
              .All()
              .Where(x => x.Id == currentUserId)
              .FirstOrDefault();

            var games = this.data.Games.All().Where(g => g.RedPlayer != currentUser && g.BluePlayer == null).Select(g => g.Id).ToList();
            var random = new Random();
            var nextRandom = random.Next(0, games.Count + 1);
            var randomGameId = games[nextRandom];

            var theGame = this.data.Games.Find(randomGameId);
            theGame.BluePlayer = currentUser;

            if (nextRandom % 10 == 0)
            {
                theGame.State = GameState.BlueInTurn;
            }
            else
            {
                theGame.State = GameState.RedInTurn;
            }

            this.data.SaveChanges();

            return Ok(string.Format(@"{""result: "" ""You joined game ""{0}""}", theGame.Name));
        }
        public IHttpActionResult GetById(int id)
        {
            // TODO: refactor extract method
            var currentUserId = this.User.Identity.GetUserId();
            var currentUser = this.data
              .Users
              .All()
              .Where(x => x.Id == currentUserId)
              .FirstOrDefault();

            var game = this.data
                .Games
                .Find(id);

            if (game == null)
            {
                return NotFound();
            }
            if (game.RedPlayer != currentUser && game.BluePlayer != currentUser)
            {
                return BadRequest("Not authorized to see others' games!");
            }

            var model = new GameModel()
            {
                Blue = game.BluePlayer.UserName,
                DateCreated = game.DateCreated,
                GameState = game.State.ToString(),
                Id = game.Id,
                Name = game.Name,
                Red = game.RedPlayer.UserName,
            };

            return Ok(model);

        }
        public IHttpActionResult Create(GameModel model)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest();
            }

            var currentUserId = this.User.Identity.GetUserId();
            var currentUser = this.data
              .Users
              .All()
              .Where(x => x.Id == currentUserId)
              .FirstOrDefault();

            var game = new Game()
            {
                Name = model.Name,
                RedPlayer = currentUser,
                RedPlayerGuess = model.Number,
                DateCreated = DateTime.Now,
            };

            this.data.Games.Add(game);
            currentUser.Games.Add(game);
            this.data.SaveChanges();

            model.Id = game.Id;
            model.GameState = game.State.ToString();
            model.Red = currentUser.UserName;
            model.DateCreated = game.DateCreated;

            return Ok(model);
        }