using YachtDice.Categories; using YachtDice.Scoring; namespace YachtDice.UI.Presentation { public sealed class ScoreSummaryService : IScoreSummaryService { private const int UpperBonusThreshold = 63; private const int UpperBonusValue = 35; private readonly ScoringSystem _scoringSystem; private readonly CategoryCatalog _categoryCatalog; public ScoreSummaryService(ScoringSystem scoringSystem, CategoryCatalog categoryCatalog) { _scoringSystem = scoringSystem; _categoryCatalog = categoryCatalog; } public ScoreSummary Calculate() { var upperSum = CalculateUpperSum(); var hasUpperBonus = upperSum >= UpperBonusThreshold; var total = _scoringSystem.TotalScore; if (hasUpperBonus) total += UpperBonusValue; return new ScoreSummary(total, upperSum, hasUpperBonus); } private int CalculateUpperSum() { var upperSum = 0; var allCategories = _categoryCatalog.All; for (var i = 0; i < allCategories.Count; i++) { var category = allCategories[i]; if (!category.IsUpperSection) continue; var categoryScore = _scoringSystem.GetCategoryScore(category); if (categoryScore >= 0) upperSum += categoryScore; } return upperSum; } } }