import type { AuditLogEntry } from "~/models/audit-log"; export const AUDIT_ACTION_LABELS: Record = { league_settings_changed: "League Settings Changed", draft_settings_changed: "Draft Settings Changed", scoring_rules_changed: "Scoring Rules Changed", draft_order_set: "Draft Order Set", draft_order_randomized: "Draft Order Randomized", draft_started: "Draft Started", draft_paused: "Draft Paused", draft_resumed: "Draft Resumed", draft_reset: "Draft Reset", draft_rollback: "Draft Rolled Back", force_autopick: "Forced Auto-Pick", force_manual_pick: "Forced Manual Pick", draft_pick_changed: "Pick Replaced", time_bank_edited: "Time Bank Edited", }; function formatSeconds(seconds: number): string { const m = Math.floor(Math.abs(seconds) / 60); const s = Math.abs(seconds) % 60; const sign = seconds < 0 ? "-" : "+"; if (m === 0) return `${sign}${s}s`; return `${sign}${m}m ${s}s`; } function formatTimeRemaining(seconds: number): string { const m = Math.floor(seconds / 60); const s = seconds % 60; return `${m}:${String(s).padStart(2, "0")}`; } /** * Returns a concise human-readable summary of an audit log entry. * Shared between the league home page summary widget and the full audit log page. */ export function formatAuditDetail(entry: AuditLogEntry): string { const d = (entry.details ?? {}) as Record; switch (entry.action) { case "draft_rollback": return `Rolled back to pick #${d.rolledBackToPickNumber}`; case "time_bank_edited": { const adj = Number(d.adjustment ?? 0); const remaining = Number(d.newTimeRemaining ?? 0); return `${formatSeconds(adj)} for ${d.teamName ?? "team"} (now ${formatTimeRemaining(remaining)})`; } case "draft_pick_changed": return `Pick #${d.pickNumber}: ${d.oldParticipantName} → ${d.newParticipantName}`; case "force_autopick": return `Auto-picked ${d.participantName} for ${d.teamName} at pick #${d.pickNumber}`; case "force_manual_pick": return `Picked ${d.participantName} for ${d.teamName} at pick #${d.pickNumber}`; case "draft_order_set": return "Draft order manually set"; case "draft_order_randomized": return "Draft order randomized"; case "draft_reset": { const prev = d.previousPickNumber; return prev !== null && prev !== undefined ? `Draft reset (was at pick #${prev})` : "Draft reset"; } case "league_settings_changed": { const fields = (d.changedFields as string[] | undefined) ?? []; return fields.length > 0 ? `Changed: ${fields.join(", ")}` : "League settings updated"; } case "draft_settings_changed": { const fields = (d.changedFields as string[] | undefined) ?? []; return fields.length > 0 ? `Changed: ${fields.join(", ")}` : "Draft settings updated"; } case "scoring_rules_changed": return "Scoring rules updated"; case "draft_started": return "Draft started"; case "draft_paused": return d.pickNumber !== null && d.pickNumber !== undefined ? `Draft paused at pick #${d.pickNumber}` : "Draft paused"; case "draft_resumed": return d.pickNumber !== null && d.pickNumber !== undefined ? `Draft resumed at pick #${d.pickNumber}` : "Draft resumed"; default: return (entry.action as string).replace(/_/g, " "); } }