import type { EvidenceSignal } from "../api/types"; type TFunction = (key: string, options?: Record) => string; // The backend never emits prose for data-quality evidence -- only stable signal codes // plus raw data params (see backend/app/services/data_quality.py::_open_issue). This is // the one place that turns them into the operator's selected language, shared by the // issue detail page and the dashboard attention queue so the same code always reads the // same way everywhere it appears. export function describeEvidenceSignal( t: TFunction, formatNumber: (value: number) => string, signal: EvidenceSignal, ): string { const { code, params = {} } = signal; if (code.startsWith("vehicle.")) { return t(`quality:detail.vehicleStatusConflict.reasonCodes.${code}`, { defaultValue: code }); } switch (code) { case "missing_field": return t("quality:detail.evidence.missingField", { field: t(`quality:detail.missingField.fields.${params.field}`, { defaultValue: String(params.field) }), }); case "overlap.reserved_bookings": return t("quality:detail.evidence.overlapReservedBookings", { refs: Array.isArray(params.refs) ? params.refs.join(" ↔ ") : "", }); case "odometer.regression": return t("quality:detail.evidence.odometerRegression", { laterRef: params.later_ref, laterKm: formatNumber(Number(params.later_km ?? 0)), earlierRef: params.earlier_ref, earlierKm: formatNumber(Number(params.earlier_km ?? 0)), }); case "duplicate.similar_name": return t("quality:detail.evidence.duplicateSimilarName", { score: params.score }); case "attention.upcoming_booking_missing_inspection": return t("quality:detail.evidence.upcomingBookingMissingInspection", { bookingRef: params.booking_ref }); default: return t(`quality:detail.evidence.${code}`, { defaultValue: code }); } }