public NextBatterResult SaveNewGameState([FromBody] BaseballGameStateResult gameState)
        {
            var dataCache = new DataCache();

            if (gameState.GameStat != null)
            {
                var originalState = BaseballService.GetInstance().GetExistingGameState(gameID: gameState.GameID, leagueID: gameState.LeagueID, dataCache: dataCache);
                GamesService.GetInstance().AddStat(ConvertObjects.ConvertType(gameState.GameStat), originalState);
                int rbis = 0;
                foreach (var player in gameState.RunnersScored)
                {
                    rbis++;
                    GamesService.GetInstance().AddStat(ConvertObjects.ConvertType(new StatRequest()
                    {
                        GameID     = gameState.GameID,
                        PlayerID   = player.ID,
                        StatTypeID = (int)CalculatedStatTypes.Runs,
                        TeamID     = gameState.GameStat.TeamID,
                        Value      = 1,
                        GroupID    = gameState.GameStat.GroupID,
                    }));
                }

                if (rbis > 0)
                {
                    GamesService.GetInstance().AddStat(ConvertObjects.ConvertType(new StatRequest()
                    {
                        GameID     = gameState.GameID,
                        PlayerID   = gameState.GameStat.PlayerID,
                        StatTypeID = (int)CalculatedStatTypes.RBI,
                        TeamID     = gameState.GameStat.TeamID,
                        Value      = rbis,
                        GroupID    = gameState.GameStat.GroupID,
                    }), originalState);
                }
            }
            bool manualAdjustment = gameState.GameStat == null;
            var  result           = BaseballService.GetInstance().SaveNewGameState(ConvertObjects.ConvertType(gameState), manualAdjustment, dataCache: dataCache);

            if (gameState.GameStat != null)
            {
                //Create new at bat group for player
                StatsService.GetInstance().CreateNewStatGroup((int)SportsList.Baseball, gameState.GameID, gameState.GameStat.PlayerID, gameState.GameStat.TeamID);
            }
            return(ConvertObjects.ConvertType(result));
        }
        public BaseballGameStateResult AddStat([FromBody] StatRequest statRequest)
        {
            var dataCache = new DataCache();
            var gameStat  = ConvertObjects.ConvertType(statRequest);

            AtBatStates gameStates = null;

            if (statRequest.IsBaseball)
            {
                gameStates = BaseballService.GetInstance().GetGameStates(gameStat, statRequest.IsLatestGroup, dataCache);
            }

            NextBatterResult nextBatter = null;
            bool             dataSaved  = false;

            if (gameStates == null || (!gameStates.NewState.PotentialAdjustment && !gameStates.NewState.InningChanged))
            {
                dataSaved = true;
                GamesService.GetInstance().AddStat(gameStat, gameStates?.OriginalState);
                if (statRequest.IsBaseball && gameStates.NewState.ChangeState)
                {
                    nextBatter = ConvertObjects.ConvertType(BaseballService.GetInstance().SaveNewGameState(gameStates.NewState, false, dataCache: dataCache));
                    //Create new at bat group for player
                    StatsService.GetInstance().CreateNewStatGroup((int)SportsList.Baseball, gameStat.GameID, gameStat.PlayerID, gameStat.TeamID);
                }
            }

            if (statRequest.IsBaseball)
            {
                var gameStateResult = ConvertObjects.ConvertType(gameStates.NewState);
                gameStateResult.GameStat    = statRequest;
                gameStateResult.NextBatter  = nextBatter;
                gameStateResult.DataSaved   = dataSaved;
                gameStateResult.IsStatsPage = true;
                return(gameStateResult);
            }
            else
            {
                return(new BaseballGameStateResult()
                {
                    DataSaved = true
                });
            }
        }
        private GameResult GetGameResult(int leagueID, int gameID)
        {
            try
            {
                var dataCache = new DataCache();
                var game      = GamesService.GetInstance().GetGame(gameID, dataCache: dataCache);
                var teams     = new List <int>()
                {
                    game.Team1ID, game.Team2ID
                };
                var allTeams  = TeamsService.GetInstance().GetTeams(leagueID: leagueID, validTeams: teams, dataCache: dataCache);
                var players   = PlayersService.GetInstance().GetPlayers(gameID: gameID, leagueID: leagueID, dataCache: dataCache);
                var statTypes = GamesService.GetInstance().GetStatTypes(game.SportID, dataCache: dataCache).OrderBy(s => s.GridDisplayOrder);
                var gameState = BaseballService.GetInstance().GetExistingGameState(gameID, leagueID, dataCache: dataCache);

                int?playerAtBat = gameState.TopOfInning ? gameState.Team1Player?.ID : gameState.Team2Player?.ID;

                var gameResult = new GameResult()
                {
                    ID             = game.ID,
                    GameDate       = game.GameDate,
                    StatTypes      = statTypes.Select(s => ConvertObjects.ConvertType(s)).ToList(),
                    QuickStatTypes = statTypes
                                     .Where(st => st.QuickButtonOrder > 0)
                                     .Select(s => ConvertObjects.ConvertType(s))
                                     .OrderBy(s => s.QuickButtonOrder)
                                     .ToList(),
                    Team1ID          = game.Team1ID,
                    Team1Score       = game.Team1Score,
                    Team1Name        = game.Team1Name,
                    Team2ID          = game.Team2ID,
                    Team2Score       = game.Team2Score,
                    Team2Name        = game.Team2Name,
                    Team1PlayerStats = game.PlayerStats
                                       .Where(p => p.TeamID == game.Team1ID)
                                       .Select(g =>
                    {
                        var order = Convert.ToInt16(g.Stats.Where(s => s.StatType.ID == (int)CalculatedStatTypes.BattingOrder).Sum(s => s.Value));
                        return(new PlayerStatsResult()
                        {
                            PlayerID = g.PlayerID,
                            PlayerName = players.FirstOrDefault(p => p.ID == g.PlayerID)?.Name,
                            PlayerNumber = players.FirstOrDefault(p => p.ID == g.PlayerID)?.Number ?? 0,
                            Order = order == 0 ? (int?)null : order,
                            AtBat = game.SportID == (int)SportsList.Baseball && g.PlayerID == playerAtBat,
                            PlayerStats = g.Stats.OrderBy(s => s.StatType.GridDisplayOrder)
                                          .Select(s => new StatResult()
                            {
                                StatTypeID = s.StatType.ID,
                                Name = s.StatType.Name,
                                DefaultShow = s.StatType.DefaultShow,
                                Value = s.Value
                            }).ToList()
                        });
                    })
                                       .ToList(),
                    Team2PlayerStats = game.PlayerStats
                                       .Where(p => p.TeamID == game.Team2ID)
                                       .Select(g =>
                    {
                        var order = Convert.ToInt16(g.Stats.Where(s => s.StatType.ID == (int)CalculatedStatTypes.BattingOrder).Sum(s => s.Value));
                        return(new PlayerStatsResult()
                        {
                            PlayerID = g.PlayerID,
                            PlayerName = players.FirstOrDefault(p => p.ID == g.PlayerID)?.Name,
                            PlayerNumber = players.FirstOrDefault(p => p.ID == g.PlayerID)?.Number ?? 0,
                            Order = order == 0 ? (int?)null : order,
                            AtBat = game.SportID == (int)SportsList.Baseball && g.PlayerID == playerAtBat,
                            PlayerStats = g.Stats.OrderBy(s => s.StatType.GridDisplayOrder)
                                          .Select(s => new StatResult()
                            {
                                StatTypeID = s.StatType.ID,
                                Name = s.StatType.Name,
                                DefaultShow = s.StatType.DefaultShow,
                                Value = s.Value
                            }).ToList()
                        });
                    })
                                       .ToList(),
                    Teams = allTeams.Select(t => new TeamsResult()
                    {
                        ID   = t.ID,
                        Name = t.Name
                    })
                            .ToList()
                };

                if (game.SportID == (int)SportsList.Baseball)
                {
                    gameResult.Team1PlayerStats        = gameResult.Team1PlayerStats.OrderBy(p => p.Order == 0 || p.Order == null ? 99 : p.Order).ToList();
                    gameResult.Team2PlayerStats        = gameResult.Team2PlayerStats.OrderBy(p => p.Order == 0 || p.Order == null ? 99 : p.Order).ToList();
                    gameResult.BaseballGameStateResult = ConvertObjects.ConvertType(BaseballService.GetInstance().GetExistingGameState(gameID, leagueID));
                }

                return(gameResult);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public StatsResult GetStats(int sportID, int?playerID, int gameID, int teamID, int?groupID, int leagueID)
        {
            var statsResult = GetStatTypes(sportID, playerID, gameID, teamID, groupID, leagueID);

            if (sportID == (int)SportsList.Baseball)
            {
                statsResult.BaseballGameStateResult             = ConvertObjects.ConvertType(BaseballService.GetInstance().GetExistingGameState(gameID, statsResult.LeagueID));
                statsResult.BaseballGameStateResult.IsStatsPage = true;
            }
            return(statsResult);
        }