using OmsorgCore.Domain.Common;

namespace OmsorgCore.Domain.Entities;

/// <summary>
/// Systembenutzer (Login-Konto). Getrennt von <see cref="Employee"/>, da nicht jeder Mitarbeiter
/// einen App-Zugang hat und nicht jeder Benutzer zwingend ein Mitarbeiter ist (siehe Blueprint 19.1).
/// </summary>
public class User : AuditableEntity
{
    public string Username { get; set; } = string.Empty;

    [AuditRedacted]
    public string PasswordHash { get; set; } = string.Empty;
    public bool IsActive { get; set; } = true;

    /// <summary>
    /// Wechselt, wenn eine Session dieses Users erzwungen beendet wird (siehe SessionAdminService).
    /// Wird als Claim in jeden Access-Token eingebettet und bei jedem Request dagegen geprüft -
    /// ein Wechsel invalidiert sofort alle bereits ausgestellten Access-Tokens dieses Users.
    /// </summary>
    [AuditRedacted]
    public Guid SecurityStamp { get; set; } = Guid.NewGuid();

    /// <summary>
    /// Erzwingt beim nächsten Request (außer Passwort-ändern/Logout/Refresh/Me) einen Passwortwechsel -
    /// gesetzt, wenn ein Admin ein initiales Passwort direkt vergibt statt eine Einladungsmail zu senden.
    /// </summary>
    public bool MustChangePassword { get; set; }

    public Guid RoleId { get; set; }
    public Role Role { get; set; } = null!;

    /// <summary>Optionale Verknüpfung zum Personalakte-Datensatz (nicht jeder Benutzer ist Mitarbeiter).</summary>
    public Guid? EmployeeId { get; set; }
    public Employee? Employee { get; set; }

    public ICollection<UserPermissionOverride> PermissionOverrides { get; set; } = new List<UserPermissionOverride>();
}
