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 { // ── Datenschutz: Löschfristen (5.4.2) ──────────────────────────────────── [ObservableProperty] private int _retentionYears = 3; [ObservableProperty] private string _retentionStatus = ""; public ObservableCollection ExpiredDocuments { get; } = []; /// Vom Code-Behind gesetzt: zeigt einen Bestätigungsdialog vor dem endgültigen Löschen. public Func>? OnConfirmHardDelete { get; set; } // ── Datenschutz: Löschfristen ───────────────────────────────────────────── private void LoadExpiredDocuments() { ExpiredDocuments.Clear(); var cutoff = _privacy.RetentionCutoff(); foreach (var d in _documentation.GetAll().Where(d => d.CreatedAt < cutoff)) { var student = _students.GetById(d.StudentId); ExpiredDocuments.Add(new ExpiredDocumentItem(d, student?.FullName ?? "?")); } } [RelayCommand] private void SaveRetentionYears() { _privacy.SetRetentionYears(RetentionYears); LoadExpiredDocuments(); RetentionStatus = "Gespeichert."; } [RelayCommand] private async Task HardDeleteDocument(ExpiredDocumentItem? item) { if (item is null) return; if (OnConfirmHardDelete is not null && !await OnConfirmHardDelete(item)) return; _documentation.HardDelete(item.Id); ExpiredDocuments.Remove(item); } } public class ExpiredDocumentItem(Documentation d, string studentName) { public Guid Id { get; } = d.Id; public string StudentName { get; } = studentName; public string Title { get; } = d.Title; public string CreatedAtDisplay { get; } = d.CreatedAt.ToLocalTime().ToString("dd.MM.yyyy"); }