import "server-only";
import { type Prisma } from "@/generated/prisma/client";
import { type DbClient, db } from "@/server/db";
import { logger } from "@/server/logger";

export type AuditEntry = {
  userId?: string | null;
  /** Verbo en formato "entidad.accion", p. ej. "auth.login", "sale.annul". */
  action: string;
  entity: string;
  entityId?: string | null;
  /** Frase legible: "ADMIN actualizó Toyota Corolla 2025". */
  summary: string;
  /** Cambios relevantes. Nunca incluir contraseñas, tokens ni secretos. */
  diff?: Prisma.InputJsonValue;
  ip?: string | null;
  userAgent?: string | null;
};

/**
 * Registra una acción en audit_logs.
 * Pasar `client` (el `tx` de una transacción) para que el registro sea atómico con el cambio.
 */
export async function writeAudit(entry: AuditEntry, client: DbClient = db): Promise<void> {
  await client.auditLog.create({
    data: {
      userId: entry.userId ?? null,
      action: entry.action,
      entity: entry.entity,
      entityId: entry.entityId ?? null,
      summary: entry.summary,
      ...(entry.diff === undefined ? {} : { diff: entry.diff }),
      ip: entry.ip ?? null,
      userAgent: entry.userAgent ? entry.userAgent.slice(0, 500) : null,
    },
  });
  logger.info({ action: entry.action, entity: entry.entity, entityId: entry.entityId }, "audit");
}
