namespace ClawdDotNet.Core.Audit;

/// <summary>
/// Das Audit-Log (A3): append-only. Es gibt kein Ändern und kein Löschen — Korrekturen
/// sind neue Einträge. Das ist die bewusste Designregel, nicht eine fehlende Funktion.
/// </summary>
public interface IAuditRepository
{
    /// <summary>Schreibt einen Tool-Aufruf ins Log.</summary>
    Task AppendAsync(AuditEntry entry, CancellationToken ct);

    /// <summary>Hält den Abschluss-Beleg eines Laufs fest.</summary>
    Task RecordReceiptAsync(RunReceipt receipt, CancellationToken ct);

    /// <summary>Die jüngsten Log-Einträge (für eine Übersicht/Diagnose).</summary>
    Task<IReadOnlyList<AuditEntry>> ListRecentAsync(int limit, CancellationToken ct);

    /// <summary>Alle Aufrufe eines Laufs, in zeitlicher Reihenfolge.</summary>
    Task<IReadOnlyList<AuditEntry>> ListForRunAsync(string runId, CancellationToken ct);

    /// <summary>Der Abschluss-Beleg eines Laufs, falls vorhanden.</summary>
    Task<RunReceipt?> GetReceiptForRunAsync(string runId, CancellationToken ct);

    /// <summary>Alle Belege zu einem Task — die Kosten pro Ergebnis (C7).</summary>
    Task<IReadOnlyList<RunReceipt>> ListReceiptsForTaskAsync(string taskId, CancellationToken ct);

    /// <summary>Zahl der Log-Einträge insgesamt.</summary>
    Task<int> CountAsync(CancellationToken ct);
}
