package com.xfestudio.xfeservermanager.api.audit;

import com.xfestudio.xfeservermanager.api.command.CommandSourceKind;
import com.xfestudio.xfeservermanager.api.util.ApiChecks;
import java.time.Instant;
import java.util.Map;
import java.util.Objects;
import java.util.UUID;

/** Append-only management audit entry. Maps must already be redacted before persistence. */
public record AuditEvent(
        UUID eventId,
        Instant timestamp,
        String actorId,
        String actorDisplayName,
        CommandSourceKind source,
        String action,
        String target,
        String reason,
        Map<String, String> beforeValues,
        Map<String, String> afterValues,
        Long policyVersion,
        String requestId,
        AuditOutcome outcome,
        long durationMillis,
        Map<String, String> metadata
) {
    public AuditEvent {
        Objects.requireNonNull(eventId, "eventId");
        Objects.requireNonNull(timestamp, "timestamp");
        actorId = ApiChecks.notBlank(actorId, "actorId");
        actorDisplayName = ApiChecks.notBlank(actorDisplayName, "actorDisplayName");
        Objects.requireNonNull(source, "source");
        action = ApiChecks.notBlank(action, "action");
        target = target == null ? "" : target;
        reason = reason == null ? "" : reason;
        beforeValues = ApiChecks.immutableMap(beforeValues, "beforeValues");
        afterValues = ApiChecks.immutableMap(afterValues, "afterValues");
        if (policyVersion != null && policyVersion < 0) {
            throw new IllegalArgumentException("policyVersion must be non-negative");
        }
        requestId = requestId == null ? "" : requestId;
        Objects.requireNonNull(outcome, "outcome");
        if (durationMillis < 0) {
            throw new IllegalArgumentException("durationMillis must be non-negative");
        }
        metadata = ApiChecks.immutableMap(metadata, "metadata");
    }
}
