public ActionResult ConfirmTransfers(int id, PlayerGameViewModel[] playersModel)
        {
            ViewBag.Budget = budget;

            var game = this.Data.Games.GetById(id);
            if (budget < 0)
            {
                Response.StatusCode = (int)HttpStatusCode.BadRequest;
                Response.StatusDescription = "Not enough money";
                return PartialView("_TransferPitch", playersModel);
            }

            int myPlayersCount = GetMyPlayersCount(playersModel);

            if (myPlayersCount < 15)
            {
                Response.StatusCode = (int)HttpStatusCode.BadRequest;
                Response.StatusDescription = string.Format("You have only {0} players", myPlayersCount);
                myTeam = PopulateMyPlayers(id);
                var myPlayers = MyPlayersInArray(myTeam);

                return PartialView("_TransferPitch", myPlayers);
            }

            GamePlayer gamePlayer;
            if (game.First_PlayerId == User.Identity.GetUserId())
            {
                gamePlayer = GamePlayer.FirstPlayer;
            }
            else
            {
                gamePlayer = GamePlayer.SecondPlayer;
            }

            List<int> playersModelId = new List<int>();
            List<Player> myPlayersToConfirm = new List<Player>();
            foreach (var player in playersModel)
            {
                var playerToConfirm = this.Data.Players.GetById(player.Id);
                myPlayersToConfirm.Add(playerToConfirm);
                playersModelId.Add(player.Id);
            }

            var myPlayersGame = this.Data.PlayersGames.All()
                .Where(g => g.GameId == game.Id && g.GamePlayer == gamePlayer);
            var myPlayersInGame = myPlayersGame.Select(p => p.Player).ToList();

            var gamePlayersGameweek = this.Data.PlayersGamesGameweeks.All()
                .Where(g => g.GameweekId == currentGameweekId && g.GameId == game.Id &&
                    g.GamePlayer == gamePlayer);
            var gamePlayersInGameweek = gamePlayersGameweek.Select(p => p.Player).ToList();

            var myPlayerInGameToRemove = myPlayersGame
                .Where(p => !playersModelId.Contains(p.PlayerId));
            this.Data.PlayersGames.DeleteRange(p => myPlayerInGameToRemove.Contains(p));

            var gamePlayersInGameweekToRemove = gamePlayersGameweek
                .Where(p => !playersModelId.Contains(p.PlayerId));
            this.Data.PlayersGamesGameweeks.DeleteRange(g => g.GameweekId == currentGameweekId &&
                g.GamePlayer == gamePlayer && gamePlayersInGameweekToRemove.Contains(g));

            foreach (var player in myPlayersToConfirm)
            {
                var playerFromModel = playersModel.FirstOrDefault(p => p.Id == player.Id);

                if (!myPlayersInGame.Contains(player))
                {
                    var playerExists = this.Data.PlayersGames.All().Where(g => g.GameId == game.Id)
                        .FirstOrDefault(p => p.PlayerId == player.Id);
                    if (playerExists != null)
                    {
                        Response.StatusCode = (int)HttpStatusCode.BadRequest;
                        Response.StatusDescription = string.Format("Your opponent already bought {0}", player.Name);
                        return PartialView("_TransferPitch", playersModel);
                    }

                    var playerInGame = new PlayersGame()
                    {
                        GameId = id,
                        PlayerId = player.Id,
                        GamePlayer = gamePlayer,
                        IsStarting = playerFromModel.IsStarting
                    };

                    this.Data.PlayersGames.Add(playerInGame);
                }

                if (!gamePlayersInGameweek.Contains(player))
                {
                    string aginstTeam = GetTeamAgainstInGameweek(player);

                    var playerInGameweek = new PlayersGamesGameweek()
                    {
                        GameweekId = currentGameweekId.Value,
                        PlayerId = player.Id,
                        GameId = game.Id,
                        GamePlayer = gamePlayer,
                        TeamAgainst = aginstTeam,
                        IsStarting = playerFromModel.IsStarting
                    };

                    this.Data.PlayersGamesGameweeks.Add(playerInGameweek);
                }
            }

            if (gamePlayer == GamePlayer.FirstPlayer)
            {
                game.FirstUserBudget = budget;
            }
            else
            {
                game.SecondUserBudget = budget;
            }

            this.Data.SaveChanges();

            var playersInGameCount = this.Data.PlayersGames.All()
                .Where(g => g.GameId == id).Count();
            if (game.GameState != GameState.InProgress && playersInGameCount == 30)
            {
                game.GameState = GameState.InProgress;
                game.StartedGameweek = this.Data.Gameweeks.All()
                    .FirstOrDefault(g => g.StartDate < DateTime.Now && DateTime.Now < g.Deadline).Id;
                this.Data.SaveChanges();
            }

            ViewBag.Budget = budget;

            return PartialView("_TransferPitch", playersModel);
        }
        private PlayerGameViewModel[] MyPlayersInArray(
            Dictionary<int, List<PlayerGameViewModel>> players)
        {
            PlayerGameViewModel[] playersArr = new PlayerGameViewModel[15];
            foreach (var position in players)
            {
                foreach (var player in position.Value)
                {
                    AddPlayerInArray(playersArr, player);
                }
            }

            return playersArr;
        }
 private static int GetMyPlayersCount(PlayerGameViewModel[] playersModel)
 {
     int myPlayersCount = 0;
     foreach (var cell in playersModel)
     {
         if (cell.Name != null)
         {
             myPlayersCount++;
         }
     }
     return myPlayersCount;
 }
 private void AddPlayerInArray(PlayerGameViewModel[] playersArr, PlayerGameViewModel player)
 {
     switch (player.Position)
     {
         case Position.GKP:
             for (int i = 0; i < 2; i++)
             {
                 if (playersArr[i] == null)
                 {
                     playersArr[i] = player;
                     break;
                 }
             }
             break;
         case Position.DEF:
             for (int i = 2; i < 7; i++)
             {
                 if (playersArr[i] == null)
                 {
                     playersArr[i] = player;
                     break;
                 }
             }
             break;
         case Position.MID:
             for (int i = 7; i < 12; i++)
             {
                 if (playersArr[i] == null)
                 {
                     playersArr[i] = player;
                     break;
                 }
             }
             break;
         case Position.FWD:
             for (int i = 12; i < 15; i++)
             {
                 if (playersArr[i] == null)
                 {
                     playersArr[i] = player;
                     break;
                 }
             }
             break;
         default:
             break;
     }
 }
        public ActionResult AddPlayer(int id, int? selectPlayerId)
        {
            var game = this.Data.Games.GetById(id);
            var myPlayers = MyPlayersInArray(myTeam);

            if (selectPlayerId == null)
            {
                Response.StatusCode = (int)HttpStatusCode.BadRequest;
                Response.StatusDescription = "Select any player";
                return View("_TransferPitch", myPlayers);
            }

            var playerExists = this.Data.Players.GetById(selectPlayerId.Value);

            if (!IsValidPosition(playerExists))
            {
                Response.StatusCode = (int)HttpStatusCode.BadRequest;
                Response.StatusDescription = "You already have tha maximum number of " +
                    GetFullPosition(playerExists.Position) + "s";
                return View("_TransferPitch", myPlayers);
            }

            PlayerGameViewModel newPlayer = new PlayerGameViewModel()
            {
                Id = playerExists.Id,
                Name = playerExists.Name,
                Position = playerExists.Position,
                Price = playerExists.Price,
                Points = playerExists.Points,
                RoundScore = playerExists.RoundScore,
                Team = playerExists.Team.Initials,
                IsStarting = true
            };

            if (myPlayers.Contains(newPlayer))
            {
                Response.StatusCode = (int)HttpStatusCode.BadRequest;
                Response.StatusDescription = "You already bought " + playerExists.Name;
                return View("_TransferPitch", myPlayers);
            }

            budget -= playerExists.Price;

            int startingPlayers = myTeam.Values.Select(x => x.Where(y => y.IsStarting))
                .Sum(p => p.Count());

            if (startingPlayers == 11 || !IsStarting(playerExists))
            {
                newPlayer.IsStarting = false;
            }

            ViewBag.Budget = budget;
            if (!myTeam.ContainsKey((int)newPlayer.Position))
            {
                myTeam.Add((int)newPlayer.Position, new List<PlayerGameViewModel>());
            }

            myTeam[(int)newPlayer.Position].Add(newPlayer);
            myPlayers = MyPlayersInArray(myTeam);

            return PartialView("_TransferPitch", myPlayers);
        }