using OmsorgCore.Domain.Common;
using OmsorgCore.Domain.Enums;

namespace OmsorgCore.Domain.Entities;

/// <summary>
/// Ein Eintrag im generischen Audit-Log: "wer hat wann was verändert" (Entity-Changes, per
/// SaveChanges-Interceptor automatisch erfasst) bzw. "wer hat wann was getan" (nicht-Entity-Aktionen
/// wie Login/Logout/Session-Kill, per AuditEvent explizit gemeldet). Nicht zu verwechseln mit
/// <see cref="LoginAttempt"/> (reine Brute-Force-Sperr-Historie).
/// Erbt bewusst von <see cref="Entity"/>, nicht <see cref="AuditableEntity"/> - ein Audit-Eintrag ist
/// selbst unveränderlich und braucht kein CreatedAt/UpdatedAt/Soft-Delete.
/// </summary>
public class AuditLogEntry : Entity
{
    public DateTime OccurredAtUtc { get; set; } = DateTime.UtcNow;

    public Guid? ActorUserId { get; set; }

    /// <summary>Snapshot, bleibt lesbar auch wenn der User später umbenannt oder gelöscht wird.</summary>
    public string? ActorUsername { get; set; }

    public string? IpAddress { get; set; }

    public AuditEventCategory Category { get; set; }

    /// <summary>Z. B. "Created"/"Updated"/"Deleted"/"Login"/"LoginFailed"/"Logout"/"SessionRevoked"/"AllSessionsRevoked".</summary>
    public string Action { get; set; } = string.Empty;

    /// <summary>Nur bei Category = EntityChange gesetzt, z. B. "Employee".</summary>
    public string? EntityType { get; set; }
    public Guid? EntityId { get; set; }

    /// <summary>JSON: Feld-Diff bei EntityChange, freier Kontext bei BehavioralEvent.</summary>
    public string? Details { get; set; }
}
