using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using LehrerApp.Core.Interfaces; using LehrerApp.Core.Models; using LehrerApp.Core.Services; using System.Collections.ObjectModel; using System.Globalization; namespace LehrerApp.Desktop.ViewModels; public partial class DashboardViewModel : ObservableObject { private readonly IGroupRepository _groups; private readonly ILessonRepository _lessons; private readonly IWorkTaskRepository _tasks; private readonly SchoolYearService _sy; [ObservableProperty] private string _greeting = ""; [ObservableProperty] private string _currentDate = ""; [ObservableProperty] private string _currentSchoolYear = ""; public ObservableCollection TodaysLessons { get; } = []; public ObservableCollection OpenTasks { get; } = []; public ObservableCollection CurrentGroups { get; } = []; // Navigation-Callback – wird von App.axaml.cs verdrahtet public Action? OnNavigateToGroup { get; set; } public DashboardViewModel(IGroupRepository groups, ILessonRepository lessons, IWorkTaskRepository tasks, SchoolYearService sy) { _groups = groups; _lessons = lessons; _tasks = tasks; _sy = sy; Load(); } private void Load() { var now = DateTime.Now; var today = DateOnly.FromDateTime(now); CurrentDate = now.ToString("dddd, d. MMMM yyyy", new CultureInfo("de-DE")); CurrentSchoolYear = _sy.CurrentSchoolYear(); Greeting = now.Hour < 12 ? "Guten Morgen" : now.Hour < 18 ? "Guten Tag" : "Guten Abend"; TodaysLessons.Clear(); var groups = _groups.GetBySchoolYear(_sy.CurrentSchoolYear()).ToDictionary(g => g.Id); foreach (var l in groups.Keys.SelectMany(gid => _lessons.GetByGroupAndDate(gid, today)) .OrderBy(l => l.LessonNumber)) { if (groups.TryGetValue(l.GroupId, out var g)) TodaysLessons.Add(new() { GroupName = g.Name, Topic = l.Topic }); } OpenTasks.Clear(); foreach (var t in _tasks.GetByStatus(WorkTaskStatus.Open) .Concat(_tasks.GetByStatus(WorkTaskStatus.InProgress)) .OrderBy(t => t.DueDate ?? DateOnly.MaxValue).Take(5)) OpenTasks.Add(new() { Title = t.Title, DueDate = t.DueDate?.ToString("dd.MM.") ?? "", IsOverdue = t.DueDate.HasValue && t.DueDate < today }); CurrentGroups.Clear(); foreach (var g in groups.Values.OrderBy(g => g.Name)) CurrentGroups.Add(new() { GroupId = g.Id, Name = g.Name, Subject = g.Subject ?? "" }); } [RelayCommand] private void OpenGroup(GroupChip? c) { if (c is not null) OnNavigateToGroup?.Invoke(c.GroupId); } [RelayCommand] private void Refresh() => Load(); } public class LessonItem { public string GroupName { get; set; } = ""; public string Topic { get; set; } = ""; } public class TaskItem { public string Title { get; set; } = ""; public string DueDate { get; set; } = ""; public bool IsOverdue { get; set; } } public class GroupChip { public Guid GroupId { get; set; } public string Name { get; set; } = ""; public string Subject { get; set; } = ""; }