using LehrerApp.Core.Models; namespace LehrerApp.Core.Services; public class GradingService { /// /// Berechnet die Note aus Punkten anhand des Notenschlüssels der Klausur. /// public string CalculateGrade(double achieved, double maximum, List key) { if (maximum <= 0) return "-"; var percent = achieved / maximum * 100.0; return key .OrderByDescending(k => k.MinPercent) .FirstOrDefault(k => percent >= k.MinPercent) ?.Grade ?? key.OrderBy(k => k.MinPercent).First().Grade; } /// /// Standardnotenschlüssel 1–6 nach NRW-Schema (anpassbar). /// public static List DefaultKey1To6() => [ new() { Grade = "1", MinPercent = 87.5 }, new() { Grade = "2", MinPercent = 75.0 }, new() { Grade = "3", MinPercent = 62.5 }, new() { Grade = "4", MinPercent = 50.0 }, new() { Grade = "5", MinPercent = 25.0 }, new() { Grade = "6", MinPercent = 0.0 }, ]; /// /// Standardnotenschlüssel 0–15 Punkte (Oberstufe). /// public static List DefaultKey0To15() => [ new() { Grade = "15", MinPercent = 95.0 }, new() { Grade = "14", MinPercent = 90.0 }, new() { Grade = "13", MinPercent = 85.0 }, new() { Grade = "12", MinPercent = 80.0 }, new() { Grade = "11", MinPercent = 75.0 }, new() { Grade = "10", MinPercent = 70.0 }, new() { Grade = "9", MinPercent = 65.0 }, new() { Grade = "8", MinPercent = 60.0 }, new() { Grade = "7", MinPercent = 55.0 }, new() { Grade = "6", MinPercent = 50.0 }, new() { Grade = "5", MinPercent = 45.0 }, new() { Grade = "4", MinPercent = 40.0 }, new() { Grade = "3", MinPercent = 33.0 }, new() { Grade = "2", MinPercent = 27.0 }, new() { Grade = "1", MinPercent = 20.0 }, new() { Grade = "0", MinPercent = 0.0 }, ]; /// /// Berechnet den Notendurchschnitt aus einer Liste von Notenwerten (1-6 System). /// public double AverageGrade1To6(List grades) { var numeric = grades .Select(g => int.TryParse(g, out var n) ? (int?)n : null) .Where(n => n.HasValue) .Select(n => n!.Value) .ToList(); return numeric.Count == 0 ? 0 : numeric.Average(); } /// /// Berechnet den Notendurchschnitt aus gewichteten Noten. /// public double WeightedAverage(List<(string Grade, double Weight)> grades) { var numeric = grades .Select(g => ( Value: int.TryParse(g.Grade, out var n) ? (int?)n : null, g.Weight)) .Where(g => g.Value.HasValue) .ToList(); if (numeric.Count == 0) return 0; var totalWeight = numeric.Sum(g => g.Weight); var weightedSum = numeric.Sum(g => g.Value!.Value * g.Weight); return totalWeight == 0 ? 0 : weightedSum / totalWeight; } }