public RoundDto CalculateRoundScore(RoundDto round) { var previousRoundsScoresSum = GetPreviousRoundScoresSum(round); var currentRoundRollsSum = GetCurrentRoundScore(round); var firstRollScore = round.Rolls.FirstOrDefault().Score; RoundTypeDto roundTypeDto = null; var isStrike = firstRollScore == PinsCount; if (isStrike) { round.Score = previousRoundsScoresSum + currentRoundRollsSum + 10; roundTypeDto = _roundRepository.GetRoundTypeByName("Strike"); } var isOpen = currentRoundRollsSum < PinsCount; if (isOpen) { round.Score = previousRoundsScoresSum + currentRoundRollsSum; roundTypeDto = _roundRepository.GetRoundTypeByName("Open"); } var isSpare = (currentRoundRollsSum == PinsCount && firstRollScore != PinsCount); if (isSpare) { round.Score = previousRoundsScoresSum + firstRollScore + 10; roundTypeDto = _roundRepository.GetRoundTypeByName("Spare"); } if (!isSpare && !isOpen & !isStrike) { throw new ArgumentOutOfRangeException(); } round.RoundTypeId = roundTypeDto?.Id; return(round); }