using System;
using System.Linq;
using Avalonia.Controls;
using Avalonia.Interactivity;
using ChronoFlow.Controller;
using ChronoFlow.Persistence;
using ChronoFlow.Security;
using ChronoFlow.View.Security;
using Microsoft.Data.Sqlite;
namespace ChronoFlow.View;
///
/// Das Fenster für den Benutzer-Login.
///
public partial class LoginWindow : Window
{
private readonly LoginController _loginController;
///
/// Konstruktor – Initialisiert die Oberfläche und legt bei Bedarf einen Standard-Admin an.
///
public LoginWindow()
{
InitializeComponent();
_loginController = new LoginController();
try
{
var service = new SqliteZeiterfassungsService();
service.ErstelleStandardAdmin();
}
catch (SqliteException ex) when (ex.SqliteErrorCode == 5)
{
ErrorText.Text = "⚠️ Die Datenbank ist gesperrt. Bitte schließen Sie andere Programme (z. B. DB Browser for SQLite) und starten Sie die App neu.";
ErrorText.IsVisible = true;
}
catch (Exception ex)
{
ErrorText.Text = $"Fehler beim Initialisieren: {ex.Message}";
ErrorText.IsVisible = true;
}
}
///
/// Wird aufgerufen, 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;
}
SqliteZeiterfassungsService service;
try
{
service = new SqliteZeiterfassungsService();
}
catch (SqliteException ex) when (ex.SqliteErrorCode == 5)
{
ErrorText.Text = "⚠️ Die Datenbank ist gesperrt. Bitte schließen Sie andere Programme (z. B. DB Browser) und versuchen Sie es erneut.";
ErrorText.IsVisible = true;
return;
}
var benutzerListe = service.LadeAlleBenutzer();
var matchingUsers = benutzerListe
.Where(u => u.Username.Equals(username, StringComparison.OrdinalIgnoreCase))
.ToList();
if (matchingUsers.Count == 0)
{
ErrorText.Text = "Benutzername nicht gefunden.";
ErrorText.IsVisible = true;
return;
}
if (matchingUsers.Count > 1)
{
ErrorText.Text = "Interner Fehler: Mehrere Benutzer mit gleichem Namen.";
ErrorText.IsVisible = true;
return;
}
var user = matchingUsers.First();
if (!PasswordHasher.VerifyPassword(password, user.Password))
{
ErrorText.Text = "Falsches Passwort. Bitte erneut versuchen.";
ErrorText.IsVisible = true;
return;
}
// Passwort muss geändert werden
if (user.MussPasswortAendern)
{
var dialog = new PasswortAendernDialog(user);
var neuesPasswort = await dialog.ShowDialog(this);
if (!string.IsNullOrEmpty(neuesPasswort))
{
string neuerHash = PasswordHasher.HashPassword(neuesPasswort);
user.Password = neuerHash;
user.MussPasswortAendern = false;
service.UpdateBenutzer(user);
}
else
{
ErrorText.Text = "Sie müssen ein neues Passwort setzen!";
ErrorText.IsVisible = true;
return;
}
}
try
{
// Login-Zeiten aktualisieren
var vorher = user.LetzterLogin;
user.LetzterLogin = DateTime.Now;
user.VorletzterLogin = vorher;
service.UpdateLoginZeiten(user);
// Hauptfenster öffnen
var main = new MainWindow(user);
main.Show();
main.Activate();
Close();
}
catch (SqliteException ex) when (ex.SqliteErrorCode == 5)
{
ErrorText.Text = "⚠️ Datenbank gesperrt. Bitte schließen Sie andere Programme und starten Sie die App neu.";
ErrorText.IsVisible = true;
}
catch (Exception ex)
{
ErrorText.Text = $"Interner Fehler beim Starten des Hauptfensters: {ex.Message}";
ErrorText.IsVisible = true;
}
}
}