using LehrerApp.Core.Models; namespace LehrerApp.Desktop.Services.Mcp.Tools; // Schlanke, bewusst nicht 1:1 zu den LiteDB-Entities gehaltene Rückgabetypen: verhindert, dass ein // später zum Modell hinzugefügtes Feld (z.B. ein neues personenbezogenes Attribut) unbeabsichtigt // über ein MCP-Tool nach außen dringt, nur weil es Teil der Entity-Klasse ist. public record StudentDto(Guid Id, string FirstName, string LastName, bool IsActive); public record ExamResultDto(Guid StudentId, double TotalPoints, string? Grade, bool Absent); public record ExamDto( Guid Id, Guid GroupId, string Title, DateOnly Date, ExamStatus Status, Niveau? Niveau, List? Results); public record GradeDto( Guid Id, Guid StudentId, Guid GroupId, GradeCategory Category, string Value, DateOnly Date, double Weight, string? Note); public record TimetableSlotDto(Guid Id, Guid GroupId, DayOfWeek Weekday, int PeriodNumber, string? Room); public record TimeEntryDto( Guid Id, Guid? TaskId, string Category, Guid? GroupId, DateOnly Date, TimeOnly? StartTime, TimeOnly? EndTime, int DurationMinutes, string? Description); /// ist der beim letzten KI-"Übernehmen" gespeicherte /// Materialerstellungs-Prompt (4.5.20/4.5.36) — nur gesetzt, wenn die KI für diese Phase einen /// Medienvorschlag gemacht hatte. Ein MCP-Client kann ihn direkt zur Materialerzeugung nutzen, ohne /// erst den Desktop-Dialog öffnen zu müssen. public record LessonPhaseDto( Guid Id, string Name, int DurationMinutes, string Activity, string Material, string Shorthand, string? MaterialPrompt); public record LessonAttachmentDto(string StorageId, string FileName, long SizeBytes); public record LessonDto( Guid Id, Guid UnitId, Guid GroupId, DateOnly Date, int? LessonNumber, string Topic, string? Homework, string? PlanningIdeas, LessonStatus Status, List Competencies, List Phases, List Attachments); /// Ergebnis von "download_lesson_attachment": Inhalt Base64-kodiert, weil MCP-Tool-Antworten /// als JSON/Text übertragen werden. Bewusst kein Ressourcen-URI-Mechanismus (siehe Planungsdokument) - /// dafür müsste der Server MCP-Resources anbieten, was über den Rahmen dieses Tools hinausgeht; /// stattdessen deckelt die Größe. public record AttachmentContentDto(string FileName, long SizeBytes, string Base64Content); public record UnitDto( Guid Id, Guid GroupId, string Title, DateOnly? StartDate, DateOnly? EndDate, UnitStatus Status, List Competencies); public record LessonPlanResultDto(List Units, List Lessons); public record SubjectDto(Guid Id, string Name, string ShortName); public record CompetencyItemDto(Guid Id, string Code, string Description, int SortOrder); public record CompetencyDomainDto( Guid Id, Guid SubjectId, int GradeLevel, string Name, string Code, int SortOrder, List Items); public record GroupMembershipDto( Guid Id, Guid StudentId, Guid GroupId, MembershipPeriod Period, DateOnly? JoinedAt, DateOnly? LeftAt, Niveau? Niveau); /// Ergebnis eines Write-Tools (Phase 2, siehe Planungsdokument): ist /// nur dann true, wenn der Nutzer die Änderung im Bestätigungsdialog angenommen hat. public record WriteResultDto(bool Applied, Guid? Id, string Message); public record PlaceholderInfoDto(string Name, string Type, bool Required, bool IsConstant); /// "Worksheets" aus der ursprünglichen Spec entsprechen im tatsächlichen Datenmodell den /// importierten Elternbrief-Vorlagen (.lavorlage, LehrerApp.Templating) — es gibt kein /// separates "Arbeitsblatt"-Konzept mit Fach/Klassenstufe-Metadaten. Siehe LetterTemplateTools. public record LetterTemplateDto(string Id, string Name, string Description, List Placeholders); public record LetterRenderResultDto(bool Success, string Message, string? Base64Pdf, string? SuggestedFileName); /// Eine Zeile des Untis-Hub (siehe UntisHubService) - "Kind"/"DueState" als Text statt /// Enum-Wert, damit ein KI-Client sie ohne Kenntnis des internen Enums lesen kann. GroupId ist bei /// den drei dashboard-weiten Zeilen (offene Stunden, Klassenbuch-/Hausaufgabenabgleich) null - siehe /// UntisHubJobRow. Enthalten, damit ein KI-Client die Id nicht erst über get_groups nachschlagen /// muss, um get_untis_absence_rows/get_named_untis_absence_pattern für eine hier gelistete Gruppe /// aufzurufen (Nutzer-Feedback: die GroupId war nirgends exponiert). public record UntisHubStatusRowDto( string Kind, Guid? GroupId, string GroupName, string DueState, string DueLabel, DateTime? LastRunAt, string? LastResultSummary); /// Lerngruppe (Klasse oder Kurs) - siehe GroupTools.GetGroups. Bewusst kein Verweis auf /// SubjectId->Name aufgelöst (dafür get_subjects), um nicht bei jeder Gruppe implizit einen ganzen /// Fach-Datensatz mitzuschleppen. public record GroupDto( Guid Id, string Name, GroupType Type, string SchoolYear, int GradeLevel, Guid? SubjectId, bool IsActive); /// Anonymisierte Fehlzeiten-Diskrepanz (siehe UntisComparisonTools.GetUntisAbsenceRows): /// bewusst KEIN Schülername/keine Klasse - ist die einzige Kennung, über die /// UntisComparisonTools.ApplyUntisAbsenceStatus später zurückordnet. public record UntisAbsenceRowDto( string RowId, DateOnly Date, string ReasonText, int AbsentMinutes, bool HandledOn, bool? ExternKeyInParentheses, string CurrentLocalStatus, string CurrentGuessStatus); /// Eine Zeile aus dem namentlichen Ausnahmeweg (get_named_untis_absence_pattern) - im /// Unterschied zu bewusst MIT Schülername, da genau diese /// Zusammenführung von Name und Fehlzeitendaten der Zweck des Aufrufs ist (z.B. Fehlmuster-Vergleich /// zwischen zwei Schülern) und der Nutzer sie je Anfrage einzeln freigegeben hat. public record NamedUntisAbsenceRowDto( Guid StudentId, string StudentFullName, DateOnly Date, string ReasonText, string CurrentLocalStatus, string CurrentGuessStatus); /// ist false bei Ablehnung/Timeout oder wenn keine der angegebenen /// Schüler-IDs bekannt war - ist dann null, nicht nur leer, damit ein KI-Client /// "abgelehnt" nicht mit "keine Fehlzeiten gefunden" verwechselt. public record NamedUntisAbsenceResultDto(bool Granted, string Message, List? Rows);