// TestKommentar
using System;
using System.Collections.ObjectModel;
using System.Linq;
using System.Threading.Tasks;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using ChronoFlow.Model;
using ChronoFlow.Persistence;
using ChronoFlow.View.Mitarbeiter;
namespace ChronoFlow.View.Mitarbeiter
{
///
/// ViewModel für die Mitarbeiter-Aufgabenansicht.
/// Enthält alle Aufgaben für den eingeloggten Benutzer und erlaubt das Speichern von Änderungen.
///
public partial class EmployeeTasksViewModel : ObservableObject
{
// 🧑💼 Der aktuell eingeloggte Benutzer (Mitarbeiter)
private readonly User _benutzer;
// 💾 Zugriff auf die Datenbank-Funktionen (SQL-Repository)
private readonly IZeiterfassungsRepository _repository;
// 📛 Einfacher Zugriff auf den Benutzernamen (spart Schreibarbeit)
private readonly string aktuellerBenutzername;
// 📋 Alle Zeiteinträge, die dem Benutzer angezeigt werden
[ObservableProperty]
private ObservableCollection eintraege = new();
// 💬 Statusmeldung unten im Fenster (z. B. bei Erfolg)
[ObservableProperty]
private string? statusText;
// ✅ Hilfs-Property, die sagt: "Gibt es keine Einträge?"
public bool HatKeineEintraege => Eintraege.Count == 0;
///
/// Diese Methode wird automatisch aufgerufen, wenn sich die Einträge ändern.
/// Damit wird die UI über die Änderung von 'HatKeineEintraege' informiert.
///
partial void OnEintraegeChanged(ObservableCollection? oldValue, ObservableCollection newValue)
{
OnPropertyChanged(nameof(HatKeineEintraege));
}
///
/// Konstruktor: Bekommt den eingeloggten Benutzer und das Repository.
/// Lädt automatisch alle offenen Einträge für diesen Benutzer.
///
public EmployeeTasksViewModel(User benutzer, IZeiterfassungsRepository repository)
{
_benutzer = benutzer;
_repository = repository;
aktuellerBenutzername = benutzer.Username;
Console.WriteLine($"[DEBUG] ViewModel erstellt für Benutzer: {aktuellerBenutzername}");
// Daten automatisch beim Öffnen laden
_ = LadeEintraegeAsync();
}
///
/// Lädt alle offenen Einträge für den aktuell eingeloggten Mitarbeiter.
/// Sortiert nach Fälligkeitsdatum (Endzeit).
/// Erkennt auch, ob seit dem letzten Login Änderungen gemacht wurden.
///
[RelayCommand]
public async Task LadeEintraegeAsync()
{
var eintraegeAusDb = await _repository.GetEintraegeFuerMitarbeiterAsync(aktuellerBenutzername);
var offene = eintraegeAusDb
.Where(e => !e.Erledigt)
.OrderBy(e => e.Endzeit)
.ToList();
// 🔔 Markiere geänderte Einträge seit dem letzten Login
foreach (var eintrag in offene)
{
eintrag.WurdeSeitLoginBearbeitet = eintrag.LetzteBearbeitung > _benutzer.VorletzterLogin;
}
// 🔔 Zeige Hinweis, wenn neue Änderungen vorhanden sind
if (offene.Any(e => e.WurdeSeitLoginBearbeitet))
StatusText = "📢 Es wurden Aufgaben seit Ihrem letzten Login geändert.";
// 🔄 Aktualisiere ObservableCollection für UI
Eintraege = new ObservableCollection(offene);
}
///
/// Speichert alle Änderungen an den sichtbaren Einträgen
/// (Status 'erledigt' + Mitarbeiter-Kommentar).
/// Danach wird die Liste automatisch neu geladen.
///
[RelayCommand]
public async Task SpeichereEintraegeAsync()
{
foreach (var eintrag in Eintraege)
{
await _repository.UpdateStatusUndKommentarAsync(
eintrag.Id,
eintrag.Erledigt,
eintrag.MitarbeiterKommentar
);
}
StatusText = "✅ Änderungen gespeichert.";
// 🔄 Nach dem Speichern direkt neu laden
await LadeEintraegeAsync();
}
}
}