public void Delete(GameStatistics model)
 {
     using (var context = new BolfTrackerContext())
     {
         context.GameStatistics.Remove(model);
         context.SaveChanges();
     }
 }
 public void Add(GameStatistics model)
 {
     using (var context = new BolfTrackerContext())
     {
         context.GameStatistics.Attach(model);
         context.Entry(model).State = EntityState.Added;
         context.SaveChanges();
     }
 }
        public void CalculateGameStatistics(int gameId)
        {
            Check.Argument.IsNotZeroOrNegative(gameId, "gameId");

            var game = _gameRepository.GetById(gameId);
            var players = game.Shots.Select(s => s.Player).Distinct();

            int maxPoints = 0;

            // The first thing that we want to calculate is the max number of points scored (the winner's points). This way
            // we can easily determine who the winner is later when actually adding the stats to the repository.
            foreach (var player in players)
            {
                int playerPoints = player.Shots.Where(s => s.Game.Id == gameId).Sum(s => s.Points);

                if (playerPoints > maxPoints)
                {
                    maxPoints = playerPoints;
                }
            }

            foreach (var player in players)
            {
                var gameStatistics = new GameStatistics();

                gameStatistics.Game = game;
                gameStatistics.Player = player;
                gameStatistics.Points = player.Shots.Where(s => s.Game.Id == gameId).Sum(s => s.Points);
                gameStatistics.ShotsMade = player.Shots.Count(s => s.Game.Id == gameId && s.ShotMade);
                gameStatistics.Attempts = player.Shots.Where(s => s.Game.Id == gameId).Sum(s => s.Attempts);
                gameStatistics.Pushes = player.Shots.Count(s => s.Game.Id == gameId && s.ShotType.Id == ShotTypePush);
                gameStatistics.Steals = player.Shots.Count(s => s.Game.Id == gameId && s.ShotType.Id == ShotTypeSteal);
                gameStatistics.SugarFreeSteals = player.Shots.Count(s => s.Game.Id == gameId && s.ShotType.Id == ShotTypeSugarFreeSteal);
                gameStatistics.Winner = (gameStatistics.Points == maxPoints);

                _gameStatisticsRepository.Add(gameStatistics);
            }

            _unitOfWork.Commit();
        }
        public void CalculateGameStatistics(int gameId)
        {
            Check.Argument.IsNotZeroOrNegative(gameId, "gameId");

            var game = _gameRepository.GetById(gameId);
            var gameShots = _shotRepository.GetByGame(gameId);

            // Watch out for games that were created but never started
            if (gameShots.Any())
            {
                var players = _playerRepository.GetByGame(gameId);

                int maxPlayerPoints = 0;
                int maxHole = gameShots.Max(s => s.Hole.Id);

                // The first thing that we want to calculate is the max number of points scored (the winner's points). This way
                // we can easily determine who the winner is later when actually adding the stats to the repository.
                foreach (var player in players)
                {
                    int playerPoints = gameShots.Where(s => s.Player.Id == player.Id).Sum(s => s.Points);

                    if (playerPoints > maxPlayerPoints)
                    {
                        maxPlayerPoints = playerPoints;
                    }
                }

                // Calculate all of the game statistics for each player individually
                foreach (var player in players)
                {
                    var playerShots = gameShots.Where(s => s.Player.Id == player.Id);
                    var playerGameStatistics = new PlayerGameStatistics();

                    playerGameStatistics.Game = game;
                    playerGameStatistics.Player = player;
                    playerGameStatistics.Points = playerShots.Where(s => s.ShotType.Id != ShotTypePush).Sum(s => s.Points);
                    playerGameStatistics.ShotsMade = playerShots.Count(s => s.ShotMade);
                    playerGameStatistics.Attempts = playerShots.Sum(s => s.Attempts);
                    playerGameStatistics.ShootingPercentage = Decimal.Round((decimal)playerGameStatistics.ShotsMade / (decimal)playerGameStatistics.Attempts, 3, MidpointRounding.AwayFromZero);
                    playerGameStatistics.Pushes = playerShots.Count(s => s.ShotType.Id == ShotTypePush);
                    playerGameStatistics.Steals = playerShots.Count(s => s.ShotType.Id == ShotTypeSteal);
                    playerGameStatistics.SugarFreeSteals = playerShots.Count(s => s.ShotType.Id == ShotTypeSugarFreeSteal);
                    playerGameStatistics.Winner = (playerGameStatistics.Points == maxPlayerPoints);
                    playerGameStatistics.OvertimeWin = playerShots.Max(s => s.Hole.Id > 10 && playerGameStatistics.Winner);
                    playerGameStatistics.GameWinningSteal = playerShots.Any(s => s.Hole.Id == maxHole && (s.ShotType.Id == ShotTypeSteal || s.ShotType.Id == ShotTypeSugarFreeSteal));

                    int totalGamePoints = gameShots.Sum(s => s.Points);

                    playerGameStatistics.Shutout = playerGameStatistics.Points == totalGamePoints;
                    playerGameStatistics.PerfectGame = playerGameStatistics.Shutout && (playerGameStatistics.ShotsMade == playerGameStatistics.Attempts);

                    _playerGameStatisticsRepository.Add(playerGameStatistics);
                }

                // Calculate the total stats for the game
                var gameStatistics = new GameStatistics();

                gameStatistics.Game = game;
                gameStatistics.HoleCount = maxHole;

                // if HoleCount mod NumberOfHoles = 0 --> OvertimeCount = HoleCount / NumberOfHoles
                // else OvertimeCount = (HoleCount - (HoleCount mod NumberOfHoles)) / NumberOfHoles

                gameStatistics.OvertimeCount = (maxHole > 10) ? 1 : 0;
                gameStatistics.PlayerCount = gameShots.Select(s => s.Player.Id).Distinct().Count();
                gameStatistics.Points = gameShots.Where(s => s.ShotType.Id != ShotTypePush).Sum(s => s.Points);
                gameStatistics.ShotsMade = gameShots.Count(s => s.ShotMade);
                gameStatistics.Attempts = gameShots.Sum(s => s.Attempts);
                gameStatistics.ShotsMissed = gameStatistics.Attempts - gameStatistics.ShotsMade;
                gameStatistics.ShootingPercentage = Decimal.Round((decimal)gameStatistics.ShotsMade / (decimal)gameStatistics.Attempts, 3, MidpointRounding.AwayFromZero);
                gameStatistics.Pushes = gameShots.Count(s => s.ShotType.Id == ShotTypePush);
                gameStatistics.Steals = gameShots.Count(s => s.ShotType.Id == ShotTypeSteal);
                gameStatistics.SugarFreeSteals = gameShots.Count(s => s.ShotType.Id == ShotTypeSugarFreeSteal);
                gameStatistics.StainlessSteals = gameShots.Count(s => (s.ShotType.Id == ShotTypeSteal || s.ShotType.Id == ShotTypeSugarFreeSteal) && s.ShotMade && s.Attempts == 1);

                _gameStatisticsRepository.Add(gameStatistics);
            }
        }