private void ChechForWinner(MakeGuessModel guess, Game game, ApplicationUser user)
        {
            if (user.Id == game.RedId && guess.Number == game.BlueNumber)
            {
                game.GameState = GameState.Finished;
                this.SendWinnerNotification(user, game);
            }

            if (user.Id == game.BlueId && guess.Number == game.RedNumber)
            {
                game.GameState = GameState.Finished;
                this.SendWinnerNotification(user, game);
            }
        }
        public IHttpActionResult Create(int id, MakeGuessModel guess)
        {
            if (!this.ModelState.IsValid)
            {
                return this.BadRequest(this.ModelState);
            }

            var game = this.BullsAndCowsData.Games.All().FirstOrDefault(g => g.Id == id);

            if (game == null)
            {
                return this.NotFound();
            }

            if (game.GameState == GameState.Finished)
            {
                return this.BadRequest(GameClosed);
            }

            if (game.GameState == GameState.WaitingForOpponent)
            {
                return this.BadRequest(YouCannotMakeGuessesInAGameThatYouReNotPartOf);
            }

            var userId = this.User.Identity.GetUserId();
            var user = this.BullsAndCowsData.Users.All().First(u => u.Id == userId);

            if (this.CheckIfAValidPlayer(game, user))
            {
                return this.BadRequest(YouCannotMakeGuessesInAGameThatYouReNotPartOf);
            }

            if (this.CheckTurn(game, user))
            {
                return this.BadRequest(ItsNotYourTurn);
            }

            var resultGuess = this.BuildGuess(guess, game, user);

            this.ChechForWinner(guess, game, user);

            return this.Ok(new GuessModel(resultGuess, user));
        }
        private Guess BuildGuess(MakeGuessModel guess, Game game, ApplicationUser user)
        {
            var bullCount = 0;
            var cowCount = 0;

            if (user == game.Red)
            {
                GameManager.CountBullsAndCows(guess.Number, game.BlueNumber, out bullCount, out cowCount);
            }

            if (user == game.Blue)
            {
                GameManager.CountBullsAndCows(guess.Number, game.RedNumber, out bullCount, out cowCount);
            }

            var newGuess = new Guess
            {
                DateMade = DateTime.Now,
                Number = guess.Number,
                BullsCount = bullCount,
                CowsCount = cowCount,
                User = user,
                Game = game,
            };


            if (user == game.Red)
            {
                this.BullsAndCowsData.Games.All().First().RedGuesses.Add(newGuess);
                game.GameState = GameState.BlueInTurn;

            }

            if (user == game.Blue)
            {
                this.BullsAndCowsData.Games.All().First().BlueGuesses.Add(newGuess);
                game.GameState = GameState.RedInTurn;
            }

            this.SendNotification(user, game);
            this.BullsAndCowsData.SaveChanges();
            return newGuess;
        }
        public IHttpActionResult JoinGame(int id, MakeGuessModel joiner)
        {
            if (!this.ModelState.IsValid)
            {
                return this.BadRequest(this.ModelState);
            }

            var game = this.BullsAndCowsData.Games.All().FirstOrDefault(g => g.Id == id);

            if (game == null)
            {
                return this.NotFound();
            }

            if (game.GameState == GameState.Finished)
            {
                return this.BadRequest(FinishedGame);
            }

            if (game.GameState != GameState.WaitingForOpponent)
            {
                return this.BadRequest(YouCannotJoinOngoingGame);
            }

            var userId = this.User.Identity.GetUserId();
            var user = this.BullsAndCowsData.Users.All().FirstOrDefault(u => u.Id == userId);

            if (game.Red == user)
            {
                return this.BadRequest(YouCannotJoinTheSameGameTwice);
            }

            game.Blue = user;
            game.GameState = GameManager.GetPlayerInTurn();
            game.BlueNumber = joiner.Number;
            this.BullsAndCowsData.Games.Update(game);
            this.BullsAndCowsData.SaveChanges();
            var result = new { result = YouJoinedGame + game.Name };

            this.CreateNotificationForTurn(game);
            this.CreateNotification(user, game);

            return this.Ok(result);
        }