using System.Text.Json;

public class AuditService : IAuditService
{
    private readonly AppDbContext _db;
    private readonly ICurrentUserService _currentUser;
    private readonly IHttpContextAccessor _http;

    public AuditService(
        AppDbContext db,
        ICurrentUserService currentUser,
        IHttpContextAccessor http)
    {
        _db = db;
        _currentUser = currentUser;
        _http = http;
    }

    public async Task WriteAsync(
        AuditAction action,
        string entityType,
        Guid entityId,
        object? previousValue = null,
        object? newValue = null,
        string? reason = null)
    {
        var correlationId = _http.HttpContext?.Items["CorrelationId"]?.ToString();

        _db.ClinicalAuditLogs.Add(new ClinicalAuditLog
        {
            Id = Guid.NewGuid(),
            Action = action,
            EntityType = entityType,
            EntityId = entityId,
            UserId = _currentUser.UserId,
            UserDisplayName = _currentUser.DisplayName ?? _currentUser.Username,
            PreviousValueJson = previousValue is null ? null : JsonSerializer.Serialize(previousValue),
            NewValueJson = newValue is null ? null : JsonSerializer.Serialize(newValue),
            Reason = reason,
            IpAddress = _currentUser.IpAddress,
            CorrelationId = correlationId,
            CreatedAt = DateTimeOffset.UtcNow
        });

        await _db.SaveChangesAsync();
    }
}