import type { TFunction } from "i18next"; import { REASON_CODES, type LedgerEvent } from "@parking/shared"; // Localize a signed event's reason. The ledger signs a STABLE `reasonCode` (+ params) // plus an English `reason` fallback (see @parking/shared REASON_CODES). We translate // the code via the `reason.` catalog so an Albanian operator reads Albanian and // an English operator reads English — from the SAME immutable event. Legacy events // (signed before reason codes existed) carry only `reason`, so we show that verbatim. const CODE_SET = new Set(REASON_CODES); /** The localized reason sentence for an event, or null if it has no reason at all. */ export function renderReason(payload: LedgerEvent["payload"], t: TFunction): string | null { if (!payload) return null; const code = typeof payload.reasonCode === "string" ? payload.reasonCode : null; if (code && CODE_SET.has(code)) { // i18next fills {{param}} from reasonParams; an absent key renders the raw token. return t(`reason.${code}`, (payload.reasonParams ?? {}) as Record); } // No code (legacy) or an unknown code (forward-compat) → the signed English fallback. return typeof payload.reason === "string" ? payload.reason : null; }