using Avalonia.Controls; using CommunityToolkit.Mvvm.ComponentModel; using LehrerApp.Core.Interfaces; using LehrerApp.Core.Models; using LehrerApp.Core.Services; using LehrerApp.Desktop.ViewModels.Groups; using LehrerApp.Desktop.ViewModels.Students; using LehrerApp.Desktop.Views; using LehrerApp.Desktop.Views.Groups; using LehrerApp.Desktop.Views.Students; using Microsoft.Extensions.DependencyInjection; namespace LehrerApp.Desktop.Services; /// Führt einen der vier bestehenden WebUntis-Abgleiche (unverändert, über ihre bestehenden /// Dialoge) aus und vermerkt das Ergebnis im - genutzt sowohl vom /// Untis-Hub-Dialog ("Jetzt prüfen" je Zeile) als auch von den WebUntis-Menüpunkten in /// MainWindow, damit beide Einstiegspunkte denselben Fälligkeitsstand pflegen. public static class UntisHubActions { public static async Task RunFehlzeitenAsync(Window owner, LearningGroup group, UntisHubJobKind kind, DateOnly start, DateOnly end, UntisHubService hub) { var vm = new WebUntisLessonAbsenceComparisonViewModel(group, App.Services.GetRequiredService(), App.Services.GetRequiredService(), App.Services.GetRequiredService(), App.Services.GetRequiredService(), App.Services.GetRequiredService(), App.Services.GetRequiredService()) { StartDate = start.ToDateTime(TimeOnly.MinValue), EndDate = end.ToDateTime(TimeOnly.MinValue) }; var loaded = TrackLoad(vm, v => v.Busy); await new WebUntisLessonAbsenceComparisonDialog { DataContext = vm }.ShowDialog(owner); if (loaded()) hub.RecordRun(kind, group.Id, vm.Status); } public static async Task RunKlassenbuchAsync(Window owner, UntisHubService hub) { var vm = new WebUntisDocumentationComparisonViewModel( App.Services.GetRequiredService(), App.Services.GetRequiredService(), App.Services.GetRequiredService(), App.Services.GetRequiredService(), App.Services.GetRequiredService()); var loaded = TrackLoad(vm, v => v.Busy); await new WebUntisDocumentationComparisonDialog { DataContext = vm }.ShowDialog(owner); if (loaded()) hub.RecordRun(UntisHubJobKind.Klassenbuchabgleich, null, vm.Status); } public static async Task RunHausaufgabenAsync(Window owner, UntisHubService hub) { var vm = new WebUntisHomeworkComparisonViewModel( App.Services.GetRequiredService(), App.Services.GetRequiredService(), App.Services.GetRequiredService(), App.Services.GetRequiredService(), App.Services.GetRequiredService(), App.Services.GetRequiredService(), App.Services.GetRequiredService(), App.Services.GetRequiredService()); var loaded = TrackLoad(vm, v => v.Busy); await new WebUntisHomeworkComparisonDialog { DataContext = vm }.ShowDialog(owner); if (loaded()) hub.RecordRun(UntisHubJobKind.Hausaufgabenabgleich, null, vm.Status); } public static async Task RunOffenePeriodsAsync(Window owner, UntisHubService hub) { var dialog = new OpenUntisPeriodsDialog(); await dialog.ShowDialog(owner); hub.RecordRun(UntisHubJobKind.OffenePeriods, null, dialog.LastStatus); } /// Erkennt nicht-invasiv (ohne die Vergleichs-ViewModels zu ändern), ob im Dialog /// tatsächlich ein Ladeversuch stattfand: Busy wechselt in Load() immer erst auf /// true und im finally-Block zurück auf false, egal ob erfolgreich oder mit Fehler /// abgebrochen - genau dieser Übergang wird hier beobachtet. private static Func TrackLoad(T vm, Func isBusy) where T : ObservableObject { var loaded = false; var wasBusy = false; vm.PropertyChanged += (_, e) => { if (e.PropertyName != "Busy") return; var busy = isBusy(vm); if (wasBusy && !busy) loaded = true; wasBusy = busy; }; return () => loaded; } }