using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using LehrerApp.Templating; using System.Collections.ObjectModel; namespace LehrerApp.Desktop.ViewModels.Settings; public partial class SettingsViewModel { [ObservableProperty] private string _letterTemplateStatus = ""; public ObservableCollection LetterTemplateList { get; } = []; private void LoadLetterTemplates() { LetterTemplateList.Clear(); foreach (var template in _letterTemplates.GetTemplates()) LetterTemplateList.Add(CreateItem(template)); } public void ImportLetterTemplate(string path) { LetterTemplateStatus = ""; try { var template = _letterTemplates.Import(path); LoadLetterTemplates(); LetterTemplateStatus = $"„{template.Name}“ wurde geprüft und lokal importiert."; } catch (Exception ex) when (ex is IOException or InvalidDataException or UnauthorizedAccessException or TemplateValidationException) { LetterTemplateStatus = $"Import fehlgeschlagen: {ex.Message}"; } } [RelayCommand] private void ValidateLetterTemplate(LetterTemplateListItem? item) { if (item is null) return; try { var refreshed = CreateItem(item.Model); var index = LetterTemplateList.IndexOf(item); if (index >= 0) LetterTemplateList[index] = refreshed; LetterTemplateStatus = $"„{item.Name}“ ist gültig (Schema {refreshed.SchemaVersion})."; } catch (Exception ex) when (ex is IOException or InvalidDataException or TemplateValidationException) { LetterTemplateStatus = $"„{item.Name}“ ist ungültig: {ex.Message}"; } } [RelayCommand] private void DeleteLetterTemplate(LetterTemplateListItem? item) { if (item is null) return; _letterTemplates.Delete(item.Id); LetterTemplateList.Remove(item); LetterTemplateStatus = "Vorlage gelöscht."; } private LetterTemplateListItem CreateItem(InstalledTemplate template) { var loaded = _letterTemplates.Load(template); return new(template, loaded.Manifest.SchemaVersion, loaded.Manifest.Placeholders.Count, loaded.Manifest.Placeholders.Count(x => x.Required)); } } public sealed class LetterTemplateListItem(InstalledTemplate model, int schemaVersion, int fieldCount, int requiredCount) { public InstalledTemplate Model { get; } = model; public string Id => Model.Id; public string Name => Model.Name; public string PackageFileName => Path.GetFileName(Model.PackagePath); public int SchemaVersion { get; } = schemaVersion; public bool HasIssues => false; public bool HasNoIssues => true; public string ValidationSummary => $"Schema {SchemaVersion} · {fieldCount} Felder ({requiredCount} Pflicht)"; public ObservableCollection Issues { get; } = []; } public sealed class LetterTemplateIssueItem(ValidationIssue issue) { public string Icon => issue.Severity == ValidationSeverity.Error ? "⛔" : "ⓘ"; public string Message => issue.Message; public string Color => issue.Severity == ValidationSeverity.Error ? "#DC2626" : "#6B7280"; }