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}");
}
}
}