using System; using System.Linq; using Avalonia.Controls; using Avalonia.Interactivity; using Avalonia.Media; using ChronoFlow.Model; using ChronoFlow.Persistence; using ChronoFlow.Security; namespace ChronoFlow.View { /// /// UI-Logik zum Hinzufügen neuer Benutzer durch einen Admin. /// public partial class MitarbeiterHinzufuegenView : UserControl { public MitarbeiterHinzufuegenView() { InitializeComponent(); } /// /// Speichert den eingegebenen Benutzer, wenn alle Pflichtfelder ausgefüllt und der Benutzername noch nicht vergeben ist. /// private void SpeichernButton_Click(object? sender, RoutedEventArgs e) { try { var service = new SqliteZeiterfassungsService(); string username = UsernameBox.Text?.Trim() ?? ""; string password = PasswordBox.Text?.Trim() ?? ""; string rolle = (RoleBox.SelectedItem as ComboBoxItem)?.Content?.ToString() ?? ""; string mitarbeiternummer = MitarbeiternummerBox.Text?.Trim() ?? ""; string abteilung = AbteilungBox.Text?.Trim() ?? ""; // Validierung: Pflichtfelder if (string.IsNullOrWhiteSpace(username) || string.IsNullOrWhiteSpace(password) || string.IsNullOrWhiteSpace(rolle)) { FeedbackText.Text = "⚠ Bitte alle Pflichtfelder ausfüllen!"; FeedbackText.Foreground = Brushes.Red; FeedbackText.IsVisible = true; return; } // Verhindern von doppelten Benutzernamen (Case-Insensitive) if (service.LadeAlleBenutzer().Any(u => u.Username.Equals(username, StringComparison.OrdinalIgnoreCase))) { FeedbackText.Text = "❌ Dieser Benutzername ist bereits vergeben."; FeedbackText.Foreground = Brushes.Red; FeedbackText.IsVisible = true; return; } // Neuen Benutzer erstellen var neuerBenutzer = new User { Username = username, Password = PasswordHasher.HashPassword(password), Role = rolle, Mitarbeiternummer = mitarbeiternummer, Abteilung = abteilung, MussPasswortAendern = true }; // Speichern in Datenbank service.ErstelleNeuenBenutzer(neuerBenutzer); FeedbackText.Text = "✅ Mitarbeiter erfolgreich gespeichert."; FeedbackText.Foreground = Brushes.Green; FeedbackText.IsVisible = true; ClearFields(); } catch (Exception ex) { FeedbackText.Text = $"❌ Fehler: {ex.Message}"; FeedbackText.Foreground = Brushes.Red; FeedbackText.IsVisible = true; Console.WriteLine("❌ Ausnahme beim Speichern:\n" + ex); } } /// /// Setzt alle Eingabefelder zurück. /// private void ClearFields() { UsernameBox.Text = ""; PasswordBox.Text = ""; MitarbeiternummerBox.Text = ""; AbteilungBox.Text = ""; RoleBox.SelectedIndex = -1; } /// /// Wechselt zurück zum Admin-Hauptfenster. /// private void ZurueckZumDashboard_Click(object? sender, RoutedEventArgs e) { if (this.VisualRoot is MainWindow mainWindow) mainWindow.ShowAdminDashboard(); else Console.WriteLine("⚠️ MainWindow nicht gefunden!"); } /// /// Erstellt einen zufälligen Test-Mitarbeiter mit dem Passwort "newpassword" (gehasht). /// private void DemoBenutzerErstellen_Click(object? sender, RoutedEventArgs e) { string[] vornamen = { "Max", "Lena", "Tobias", "Julia", "Nico", "Emma", "Finn", "Sophie", "Noah", "Laura" }; string[] nachnamen = { "Mustermann", "Schmidt", "Becker", "Klein", "Weber", "Meier", "Schulz", "Huber", "Lang", "Richter" }; var service = new SqliteZeiterfassungsService(); var existierendeUsernames = service.LadeAlleBenutzer().Select(u => u.Username).ToHashSet(StringComparer.OrdinalIgnoreCase); var rnd = new Random(); int versuche = 0; while (versuche < 100) { string vorname = vornamen[rnd.Next(vornamen.Length)]; string nachname = nachnamen[rnd.Next(nachnamen.Length)]; string name = $"{vorname} {nachname}"; if (!existierendeUsernames.Contains(name)) { var demoUser = new User { Username = name, Password = PasswordHasher.HashPassword("newpassword"), Role = "Mitarbeiter", MussPasswortAendern = true }; service.ErstelleNeuenBenutzer(demoUser); FeedbackText.Text = $"✅ Demo-Mitarbeiter '{name}' erstellt (Passwort: newpassword)"; FeedbackText.Foreground = Brushes.Green; FeedbackText.IsVisible = true; return; } versuche++; } FeedbackText.Text = "❌ Fehler: Konnte keinen eindeutigen Demo-Mitarbeiter generieren."; FeedbackText.Foreground = Brushes.Red; FeedbackText.IsVisible = true; } } }