import { FDI_TOOTH_IDS } from '../../common/fdi'; export function normalizeTeeth(teeth: unknown): string[] { if (!Array.isArray(teeth)) { return []; } const unique = new Set(); for (const tooth of teeth) { if (typeof tooth !== 'string') continue; const trimmed = tooth.trim(); if (FDI_TOOTH_IDS.has(trimmed)) { unique.add(trimmed); } } return [...unique].sort(); } export type ToothSelectionGroupNormalized = { groupId: string; kind: 'connected' | 'single'; teeth: string[]; }; export function normalizeToothSelectionGroups( value: unknown, fallbackTeeth: string[] = [], ): ToothSelectionGroupNormalized[] { if (Array.isArray(value) && value.length > 0) { const out: ToothSelectionGroupNormalized[] = []; for (const row of value) { if (!row || typeof row !== 'object') continue; const rec = row as Record; const groupId = typeof rec.groupId === 'string' && rec.groupId.trim() ? rec.groupId.trim() : ''; if (!groupId) continue; const kind = rec.kind === 'connected' ? 'connected' : 'single'; const teeth = normalizeTeeth(rec.teeth); if (teeth.length === 0) continue; out.push({ groupId, kind: kind === 'connected' && teeth.length < 2 ? 'single' : kind, teeth, }); } if (out.length > 0) return out; } return fallbackTeeth.map((tooth, index) => ({ groupId: `legacy-${tooth}-${index}`, kind: 'single' as const, teeth: [tooth], })); } export function generateTreatmentTitle( cases: { treatmentType: string; teeth: string[] }[], ): string { if (cases.length === 0) { return 'Treatment'; } const parts = cases.map((c) => { const label = c.treatmentType.charAt(0).toUpperCase() + c.treatmentType.slice(1); if (c.teeth.length > 0) { return `${label} ${c.teeth.join(', ')}`; } return label; }); return parts.join(' ยท '); }