using System;
using System.Linq;
using Avalonia.Controls;
using Avalonia.Interactivity;
using ChronoFlow.Controller;
using ChronoFlow.Persistence;
using ChronoFlow.Security;
using ChronoFlow.View.Security;
namespace ChronoFlow.View
{
///
/// Das Fenster für den Benutzer-Login.
///
public partial class LoginWindow : Window
{
private readonly LoginController _loginController;
public LoginWindow()
{
InitializeComponent();
_loginController = new LoginController();
var service = new SqliteZeiterfassungsService();
service.ErstelleStandardAdmin();
}
///
/// Wird ausgeführt, wenn der Benutzer auf "Anmelden" klickt.
///
private async void LoginButton_Click(object? sender, RoutedEventArgs e)
{
var username = UsernameBox.Text?.Trim();
var password = PasswordBox.Text?.Trim();
if (string.IsNullOrWhiteSpace(username) || string.IsNullOrWhiteSpace(password))
{
ErrorText.Text = "Bitte Benutzername und Passwort eingeben.";
ErrorText.IsVisible = true;
return;
}
var service = new SqliteZeiterfassungsService();
var benutzerListe = service.LadeAlleBenutzer();
var matchingUsers = benutzerListe.Where(u => u.Username == username).ToList();
if (matchingUsers.Count == 0)
{
ErrorText.Text = "Benutzername nicht gefunden.";
ErrorText.IsVisible = true;
return;
}
if (matchingUsers.Count > 1)
{
Console.WriteLine("[WARNUNG] Mehrere Benutzer mit gleichem Namen gefunden! Bitte Datenbank prüfen.");
ErrorText.Text = "Interner Fehler: Mehrere Benutzer mit gleichem Namen.";
ErrorText.IsVisible = true;
return;
}
var user = matchingUsers.First();
Console.WriteLine($"[DEBUG] Benutzer gefunden: {user.Username}");
Console.WriteLine($"[DEBUG] Gespeicherter Hash in DB: {user.Password}");
Console.WriteLine($"[DEBUG] Eingegebenes Passwort: {password}");
bool isMatch = PasswordHasher.VerifyPassword(password, user.Password);
Console.WriteLine($"[DEBUG] Passwortprüfung erfolgreich: {isMatch}");
if (!isMatch)
{
ErrorText.Text = "Falsches Passwort. Bitte erneut versuchen.";
ErrorText.IsVisible = true;
return;
}
// Wenn Passwortänderung erforderlich, Dialog anzeigen
if (user.MussPasswortAendern)
{
var dialog = new PasswortAendernDialog(user);
var neuesPasswort = await dialog.ShowDialog(this);
if (!string.IsNullOrEmpty(neuesPasswort))
{
string neuerHash = PasswordHasher.HashPassword(neuesPasswort);
Console.WriteLine($"[DEBUG] Neues Passwort (klar): {neuesPasswort}");
Console.WriteLine($"[DEBUG] Neuer gespeicherter Hash: {neuerHash}");
user.Password = neuerHash;
user.MussPasswortAendern = false;
service.UpdateBenutzer(user);
Console.WriteLine("✅ Passwort wurde erfolgreich geändert.");
}
else
{
ErrorText.Text = "Sie müssen ein neues Passwort setzen!";
ErrorText.IsVisible = true;
return;
}
}
// 🚀 Login erfolgreich → MainWindow starten
try
{
Console.WriteLine("🚀 Öffne MainWindow...");
var main = new MainWindow(user);
main.Show();
Console.WriteLine("✅ MainWindow wurde geöffnet.");
this.Close();
Console.WriteLine("✅ LoginWindow wurde geschlossen.");
}
catch (Exception ex)
{
Console.WriteLine($"[ERROR] MainWindow konnte nicht geöffnet werden: {ex.Message}");
ErrorText.Text = "Interner Fehler beim Starten des Hauptfensters.";
ErrorText.IsVisible = true;
}
}
}
}