using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using LehrerApp.Core.Interfaces; using LehrerApp.Core.Models; using LehrerApp.Core.Services; using LehrerApp.Data; using LehrerApp.Desktop.Services; using LehrerApp.Desktop.ViewModels.Planning; using LehrerApp.Sync; using LehrerApp.Sync.Crypto; using System.Collections.ObjectModel; using System.Globalization; using System.Security.Cryptography; using System.Text.Json; using System.Text.Json.Serialization; namespace LehrerApp.Desktop.ViewModels.Settings; public partial class SettingsViewModel { // ── Aufsichten: wiederkehrende Pausenaufsicht (4.3 Nachtrag) ───────────── [ObservableProperty] private string _newDutyWeekdayName = WeekdayDisplay.Options[0]; [ObservableProperty] private int _newDutyAfterPeriod; [ObservableProperty] private string _newDutyLocation = ""; [ObservableProperty] private string _newDutyError = ""; public string[] WeekdayOptions { get; } = WeekdayDisplay.Options; public ObservableCollection SupervisionDuties { get; } = []; // ── Aufsichten: Laden / Hinzufügen / Löschen ───────────────────────────── private void LoadSupervisionDuties() { SupervisionDuties.Clear(); foreach (var d in _supervisionDuties.GetAll()) SupervisionDuties.Add(new SupervisionDutyItem(d)); } [RelayCommand] private void AddSupervisionDuty() { NewDutyError = ""; if (string.IsNullOrWhiteSpace(NewDutyLocation)) { NewDutyError = "Ort/Bezeichnung erforderlich."; return; } if (NewDutyAfterPeriod is < 0 or > 10) { NewDutyError = "Muss zwischen 0 und 10 liegen."; return; } try { _supervisionDuties.Save(new SupervisionDuty { Weekday = WeekdayDisplay.FromLabel(NewDutyWeekdayName), AfterPeriod = NewDutyAfterPeriod, Location = NewDutyLocation.Trim(), }); } catch (InvalidOperationException ex) { NewDutyError = ex.Message; return; } NewDutyLocation = ""; NewDutyAfterPeriod = 0; LoadSupervisionDuties(); } [RelayCommand] private void RemoveSupervisionDuty(SupervisionDutyItem? item) { if (item is null) return; _supervisionDuties.Delete(item.Id); SupervisionDuties.Remove(item); } } public class SupervisionDutyItem(SupervisionDuty d) { public Guid Id { get; } = d.Id; public string WeekdayLabel { get; } = WeekdayDisplay.Label(d.Weekday); public int AfterPeriod { get; } = d.AfterPeriod; public string PeriodLabel { get; } = d.AfterPeriod == 0 ? "Vor der 1. Stunde" : $"Nach der {d.AfterPeriod}. Stunde"; public string Location { get; } = d.Location; } // ── Wochentag: deutsche Anzeige (Mo–Fr, für Aufsichten) ──────────────────────── public static class WeekdayDisplay { private static readonly (DayOfWeek Day, string Name)[] Entries = [ (DayOfWeek.Monday, "Montag"), (DayOfWeek.Tuesday, "Dienstag"), (DayOfWeek.Wednesday, "Mittwoch"), (DayOfWeek.Thursday, "Donnerstag"), (DayOfWeek.Friday, "Freitag"), ]; public static string[] Options { get; } = Entries.Select(e => e.Name).ToArray(); public static string Label(DayOfWeek d) => Entries.First(e => e.Day == d).Name; public static DayOfWeek FromLabel(string label) => Entries.FirstOrDefault(e => e.Name == label).Day; }