public GameDto GetGameById(Guid gameId)
        {
            GameDto gameDto;

            using (var context = new BowlingScoreboardDbContextFactory().CreateDbContext())
            {
                var game = context.Games
                           .Include(g => g.Players)
                           .ThenInclude(p => p.Rounds)
                           .ThenInclude(r => r.RoundType)
                           .SingleOrDefault(g => g.Id == gameId);

                gameDto = _mapper.Map <GameDto>(game);

                gameDto.Players
                .ToList()
                .ForEach(p =>
                {
                    p.Rounds.ToList().ForEach(r => r.GameId = gameId);
                    p.Rounds = p.Rounds.OrderBy(r => r.Number);
                });
            }

            return(gameDto);
        }
        public IEnumerable <PlayerDto> GetPlayersByGameIdOrderedByPlayerOrder(Guid gameId)
        {
            IEnumerable <PlayerDto> playersDto;

            using (var context = new BowlingScoreboardDbContextFactory().CreateDbContext())
            {
                var players = context.Players
                              .Where(p => p.GameId == gameId)
                              .OrderBy(p => p.PlayOrder)
                              .ToList();

                playersDto = _mapper.Map <IEnumerable <PlayerDto> >(players);
            }

            return(playersDto);
        }
        public virtual RoundTypeDto GetRoundTypeByName(string roundTypeName)
        {
            RoundTypeDto roundTypeDto;

            using (var context = new BowlingScoreboardDbContextFactory().CreateDbContext())
            {
                var roundType = context
                                .RoundTypes
                                .SingleOrDefault(rt => rt.Name == roundTypeName);


                roundTypeDto = _mapper.Map <RoundTypeDto>(roundType);
            }

            return(roundTypeDto);
        }
        public virtual IEnumerable <RoundDto> GetRoundsByPlayerId(Guid playerId)
        {
            IEnumerable <RoundDto> roundDtos;

            using (var context = new BowlingScoreboardDbContextFactory().CreateDbContext())
            {
                var rounds = context.Rounds
                             .Include(r => r.Player)
                             .Where(r => r.Player.Id == playerId)
                             .ToList();

                roundDtos = _mapper.Map <IEnumerable <RoundDto> >(rounds);
            }

            return(roundDtos);
        }
        public IEnumerable <PlayerDto> GetPlayersByRoundNumberOrderedByPlayOrder(Guid gameId, int roundNumber)
        {
            IEnumerable <PlayerDto> playersDto;

            using (var context = new BowlingScoreboardDbContextFactory().CreateDbContext())
            {
                var players = context.Rounds
                              .Include(r => r.Player)
                              .Where(r => r.Number == roundNumber && r.Player.GameId == gameId)
                              .Select(r => r.Player)
                              .OrderBy(p => p.PlayOrder)
                              .ToList();

                playersDto = _mapper.Map <IEnumerable <PlayerDto> >(players);
            }

            return(playersDto);
        }
        public int GetCurrentRoundNumber(Guid gameId)
        {
            int currentRoundNumber;

            using (var context = new BowlingScoreboardDbContextFactory().CreateDbContext())
            {
                var allPlayersRoundsCount = context.Players
                                            .Where(p => p.GameId == gameId)
                                            .Select(p => p.Rounds.Count)
                                            .ToList();

                var lastRoundNumber = allPlayersRoundsCount.Min();

                currentRoundNumber = lastRoundNumber == 10 ? lastRoundNumber : lastRoundNumber + 1;
            }

            return(currentRoundNumber);
        }
        public RoundDto CreateRound(RoundDto round)
        {
            RoundDto roundDto;

            using (var context = new BowlingScoreboardDbContextFactory().CreateDbContext())
            {
                var roundEntity = _mapper.Map <Round>(round);

                context.Rounds.Add(roundEntity);

                context.SaveChanges();

                roundDto = _mapper.Map <RoundDto>(roundEntity);

                roundDto.GameId = round.GameId;

                roundDto.PlayerId = round.PlayerId;
            }

            return(roundDto);
        }
        public GameDto CreateGame(int lineNumber, IEnumerable <PlayerDto> players)
        {
            GameDto gameDto;

            using (var context = new BowlingScoreboardDbContextFactory().CreateDbContext())
            {
                var lineId = context.Lines.SingleOrDefault(l => l.Number == lineNumber).Id;

                var playerEntities = _mapper.Map <ICollection <Player> >(players);

                var game = new Game()
                {
                    LineId  = lineId,
                    Players = playerEntities
                };

                context.Games.Add(game);
                context.SaveChanges();

                gameDto = _mapper.Map <GameDto>(game);
            }

            return(gameDto);
        }