using System; using System.Collections.ObjectModel; using System.Linq; using Avalonia.Controls; using Avalonia.Input; using Avalonia.Interactivity; using ChronoFlow.Model; using ChronoFlow.Persistence; using ChronoFlow.Security; namespace ChronoFlow.View.Admin; /// /// Zeigt eine Liste aller Benutzer mit der Rolle "Mitarbeiter" zur Bearbeitung oder Löschung. /// public partial class MitarbeiterListeView : UserControl { private readonly ViewManager _viewManager; private readonly ObservableCollection _alleMitarbeiter = new(); private readonly SqliteZeiterfassungsService _dbService = new(); /// /// Öffentlicher parameterloser Konstruktor für Avalonia (zur Vermeidung von AVLN0005-Warnungen). /// public MitarbeiterListeView() : this(new ViewManager(new ContentControl())) { Console.WriteLine("⚠ Parameterloser Konstruktor genutzt (Dummy-ViewManager)."); } /// /// Konstruktor mit ViewManager (für Navigation). /// public MitarbeiterListeView(ViewManager viewManager) { InitializeComponent(); _viewManager = viewManager; LadeMitarbeiter(); } /// /// Hilfsmethode zum Abrufen des übergeordneten Fensters. /// private Window? GetParentWindow() => this.VisualRoot as Window; /// /// Lädt alle Benutzer mit Rolle "Mitarbeiter" und zeigt sie in der Liste an. /// private void LadeMitarbeiter() { try { var mitarbeiter = _dbService.LadeAlleBenutzer() .Where(m => m.Role == "Mitarbeiter") .OrderBy(m => m.Username) .ToList(); _alleMitarbeiter.Clear(); foreach (var user in mitarbeiter) _alleMitarbeiter.Add(user); MitarbeiterListe.ItemsSource = _alleMitarbeiter; } catch (Exception ex) { Console.WriteLine($"❌ Fehler beim Laden der Mitarbeiter: {ex.Message}"); } } /// /// Filtert die Mitarbeiterliste beim Tippen im Suchfeld. /// private void Suchfeld_KeyUp(object? sender, KeyEventArgs e) { var text = Suchfeld?.Text?.ToLower() ?? ""; MitarbeiterListe.ItemsSource = _alleMitarbeiter .Where(m => m.Username.ToLower().Contains(text)) .ToList(); } /// /// Öffnet Dialog zur Bearbeitung eines Mitarbeiters. /// private async void Bearbeiten_Click(object? sender, RoutedEventArgs e) { if (sender is Button button && button.Tag is User benutzer) { var dialog = new MitarbeiterBearbeitenDialog(benutzer); var parentWindow = GetParentWindow(); if (parentWindow != null) { var updatedUser = await dialog.ShowDialog(parentWindow); if (updatedUser != null) { updatedUser.Password = benutzer.Password; updatedUser.Role = benutzer.Role; updatedUser.OriginalUsername = benutzer.Username; _dbService.UpdateBenutzer(updatedUser); LadeMitarbeiter(); } } else { Console.WriteLine("❌ Bearbeiten_Click: Konnte übergeordnetes Fenster nicht ermitteln."); } } } /// /// Löscht einen Benutzer nach Bestätigung. /// private async void Loeschen_Click(object? sender, RoutedEventArgs e) { if (sender is Button button && button.Tag is User benutzer) { var dialog = new ConfirmDialog($"Möchten Sie den Benutzer '{benutzer.Username}' wirklich löschen?"); var parentWindow = GetParentWindow(); if (parentWindow != null) { var result = await dialog.ShowDialog(parentWindow); if (result) { _dbService.LoescheBenutzer(benutzer.Username); LadeMitarbeiter(); } } else { Console.WriteLine("❌ Loeschen_Click: VisualRoot ist kein Window."); } } } /// /// Setzt das Passwort eines Benutzers zurück auf "newpassword" (gehasht). /// private async void PasswortReset_Click(object? sender, RoutedEventArgs e) { if (sender is Button button && button.Tag is User benutzer) { var parentWindow = GetParentWindow(); if (parentWindow != null) { var dialog = new ConfirmDialog($"Möchten Sie das Passwort für '{benutzer.Username}' wirklich zurücksetzen?"); var result = await dialog.ShowDialog(parentWindow); if (result) { benutzer.Password = PasswordHasher.HashPassword("newpassword"); benutzer.MussPasswortAendern = true; _dbService.UpdateBenutzer(benutzer); Console.WriteLine($"✅ Passwort für {benutzer.Username} wurde zurückgesetzt."); } } else { Console.WriteLine("❌ PasswortReset_Click: VisualRoot ist kein Window."); } } } /// /// Navigiert zurück zur Admin-Hauptansicht. /// private void ZurueckButton_Click(object? sender, RoutedEventArgs e) { try { _viewManager.Show("AdminMain"); } catch (Exception ex) { Console.WriteLine($"❌ Fehler beim Zurückspringen: {ex.Message}"); } } }