using Core.Entities; namespace Core.Printing; /// /// Ranking-index style badges: colored rank dot plus a short label. /// Student pages list ranked events; event pages list students who ranked them. /// public static class PrintRankBadgeHtml { public static string ForStudentEvents(IEnumerable? rankings) { if (rankings is null) return string.Empty; var badges = rankings .Where(r => r.Rank is >= 1 and <= StudentEventRanking.MaxRank) .OrderBy(r => r.Rank) .Select(EventBadge) .ToList(); return Wrap(badges); } public static string ForEventStudents(IEnumerable? rankings) { if (rankings is null) return string.Empty; var badges = rankings .Where(r => r.Student is not null && r.Rank is >= 1 and <= StudentEventRanking.MaxRank) .OrderBy(r => r.Rank) .ThenByDescending(r => r.Student.Grade + r.Student.TsaYear) .Select(r => StudentBadge(r.Student.FirstName, r.Rank)) .ToList(); return Wrap(badges); } internal static string EventBadge(StudentEventRanking ranking) { var evt = ranking.EventDefinition; var label = !string.IsNullOrWhiteSpace(evt?.ShortName) ? evt.ShortName : evt?.Name; var attributes = EventAttributeMarks.For(evt); var attrsHtml = string.IsNullOrEmpty(attributes) ? string.Empty : $"{PrintTokenMap.EscapeHtml(attributes)}"; return Badge(ranking.Rank, PrintTokenMap.EscapeHtml(label), attrsHtml); } internal static string StudentBadge(string? firstName, int rank) => Badge(rank, PrintTokenMap.EscapeHtml(firstName), string.Empty); private static string Badge(int rank, string labelHtml, string extraHtml) { var extra = string.IsNullOrEmpty(extraHtml) ? string.Empty : $" {extraHtml}"; return $"" + $" " + $"{labelHtml}{extra}" + ""; } public static string Legend() { var marks = EventAttributeMarks.LegendItems .Select(mark => "" + $"{PrintTokenMap.EscapeHtml(mark.Symbol)} " + PrintTokenMap.EscapeHtml(mark.Label) + ""); return "" + $"{string.Join(" · ", marks)}" + ""; } private static string Wrap(IReadOnlyList badges, string separator = " ") { if (badges.Count == 0) return string.Empty; return $"{string.Join(separator, badges)}"; } }