using LehrerApp.Core.Models; using LehrerApp.Templating; namespace LehrerApp.Desktop.Services; /// /// Baut die Standard-Platzhalterwerte für Elternbrief-Vorlagen (Datum, Anrede, Kontaktadresse, /// Schülerdaten, Brieftext, ...). Ursprünglich Teil von /// , hierher extrahiert, damit /// LetterTemplateTools (MCP, siehe Planungsdokument) dieselbe Logik nutzt statt sie zu /// duplizieren — beide Aufrufer müssen exakt dieselben Platzhalternamen befüllen, sonst driften /// Dialog-generierte und KI-generierte Briefe unbemerkt auseinander. /// public static class LetterPlaceholderBuilder { public static Dictionary BuildStandardValues( Student student, Contact? contact, LearningGroup? group, DateOnly date, string letterText, string teacherName, DrawingValue? attendanceCalendar = null, DrawingValue? absenceDays = null) { var address = FormatAddress(contact); return new Dictionary(StringComparer.Ordinal) { ["Datum"] = new DateValue(date), ["CurrentDate"] = new DateValue(date), ["Empfaenger"] = new TextValue(contact?.Name ?? ""), ["Anrede"] = new TextValue(contact?.LetterSalutation ?? ""), ["Brieftext"] = new MultilineValue(letterText), ["LehrerName"] = new TextValue(teacherName), ["Student.FirstName"] = new TextValue(student.FirstName), ["Student.LastName"] = new TextValue(student.LastName), ["Student.Name"] = new TextValue(student.FullName), ["Contact.Name"] = new TextValue(contact?.Name ?? ""), ["Contact.Address"] = new MultilineValue(address), ["Contact.Street"] = new TextValue(contact?.Street ?? ""), ["Contact.PostalCode"] = new TextValue(contact?.PostalCode ?? ""), ["Contact.City"] = new TextValue(contact?.City ?? ""), ["Letter.Salutation"] = new TextValue(contact?.LetterSalutation ?? ""), ["Group.Name"] = new TextValue(group?.Name ?? ""), ["SchoolYear"] = new TextValue(group?.SchoolYear ?? ""), [StudentAttendanceCalendarDrawingBuilder.PlaceholderName] = attendanceCalendar ?? new DrawingValue([], 0), [StudentAbsenceDayListDrawingBuilder.PlaceholderName] = absenceDays ?? new DrawingValue([], 0), }; } /// Mehrzeilige Anschrift (Name/Straße/PLZ Ort) für Adressvorschau im Dialog und /// den Contact.Address-Platzhalter - eine Formatierung für beide Verwendungen. public static string FormatAddress(Contact? contact) { var cityLine = string.Join(" ", new[] { contact?.PostalCode, contact?.City }.Where(x => !string.IsNullOrWhiteSpace(x))); return string.Join(Environment.NewLine, new[] { contact?.Name, contact?.Street, cityLine }.Where(x => !string.IsNullOrWhiteSpace(x))); } public static bool IsEmpty(PlaceholderValue value) => value switch { TextValue x => string.IsNullOrWhiteSpace(x.Value), MultilineValue x => string.IsNullOrWhiteSpace(x.Value), DrawingValue x => x.ContentHeight <= 0 || x.Commands.Count == 0, _ => false, }; }