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.Controller;
namespace ChronoFlow.View.Mitarbeiter;
///
/// ViewModel für die Aufgabenansicht eines Mitarbeiters.
/// Lädt relevante Aufgaben (nicht erledigt) und ermöglicht das Speichern von Kommentaren und Bearbeitungsstatus.
///
public partial class EmployeeTasksViewModel : ObservableObject
{
private readonly User _benutzer; // Der aktuell eingeloggte Benutzer
private readonly ZeiterfassungsController controller = new(); // Controller für Datenzugriff
private readonly string aktuellerBenutzername; // Benutzername (String, z. B. für Vergleich)
// Liste aller offenen, relevanten Aufgaben für diesen Benutzer
[ObservableProperty]
private ObservableCollection eintraege = new();
// Status-Text für Hinweise oder Rückmeldungen an den Benutzer
[ObservableProperty]
private string? statusText;
// Gibt an, ob überhaupt Aufgaben vorhanden sind (z. B. für "Keine Aufgaben"-Hinweis in der View)
public bool HatKeineEintraege => Eintraege.Count == 0;
// Wenn sich die Einträge ändern, wird auch das Property `HatKeineEintraege` neu berechnet
partial void OnEintraegeChanged(ObservableCollection? oldValue, ObservableCollection newValue)
{
OnPropertyChanged(nameof(HatKeineEintraege));
}
///
/// Konstruktor – übernimmt eingeloggten Benutzer, speichert Name für spätere Vergleiche
/// und lädt initial die relevanten Einträge.
///
public EmployeeTasksViewModel(User benutzer)
{
_benutzer = benutzer;
aktuellerBenutzername = benutzer.Username;
controller = new ZeiterfassungsController();
_ = LadeEintraegeAsync(); // asynchrone Initialladung
}
///
/// Lädt alle offenen Aufgaben für diesen Benutzer (oder wenn er Projektleiter ist).
/// Sortiert die Aufgaben nach Enddatum.
/// Markiert Aufgaben als „geändert“, wenn sie seit dem letzten Login bearbeitet wurden.
///
[RelayCommand]
public async Task LadeEintraegeAsync()
{
// Alle Aufgaben laden (aus Datenbank)
var alleEintraege = await Task.Run(() => controller.LadeAlleEintraege());
// Relevante Aufgaben filtern: noch nicht erledigt und betreffen den Benutzer
var relevanteEintraege = alleEintraege
.Where(e => !e.Erledigt &&
(e.Mitarbeiter == aktuellerBenutzername || e.Projektleiter == aktuellerBenutzername))
.OrderBy(e => e.Endzeit)
.ToList();
// Prüfung, ob Aufgabe nach letztem Login geändert wurde
foreach (var eintrag in relevanteEintraege)
{
eintrag.WurdeSeitLoginBearbeitet = eintrag.LetzteBearbeitung > _benutzer.VorletzterLogin;
}
// Hinweis anzeigen, wenn Aufgaben seit letztem Login verändert wurden
if (relevanteEintraege.Any(e => e.WurdeSeitLoginBearbeitet))
StatusText = "📢 Es wurden Aufgaben seit Ihrem letzten Login geändert.";
// Die View wird über `Eintraege` gebunden, daher muss hier neu zugewiesen werden
Eintraege = new ObservableCollection(relevanteEintraege);
}
///
/// Speichert alle Änderungen (Kommentar + Erledigt-Status) der aktuellen Aufgaben.
/// Danach wird die Liste neu geladen.
///
[RelayCommand]
public async Task SpeichereEintraegeAsync()
{
// Achtung: Diese Methode ruft direkt den Service auf.
// Dies könnte in Zukunft auch über den Controller geschehen.
foreach (var eintrag in Eintraege)
{
await Task.Run(() =>
{
var sqlite = new SqliteZeiterfassungsService();
sqlite.UpdateStatusUndKommentarAsync(eintrag.Id, eintrag.Erledigt, eintrag.MitarbeiterKommentar).Wait();
});
}
// Rückmeldung anzeigen und Liste aktualisieren
StatusText = "✅ Änderungen gespeichert.";
await LadeEintraegeAsync();
}
}