import type { RecordingDeviceSlot } from "@/lib/db/schema"; import type { ConnectedDeviceInfo } from "./types"; export interface DeviceRemapEntry { slotLabel: string; recordedBleName: string; matchedDeviceIndex: number | null; } /** * Best-effort name match from a recording's saved device slots to the * currently-connected devices. Web Bluetooth exposes no stable hardware id * across sessions, so this is inherently approximate: two devices sharing an * identical advertised name are indistinguishable and must be disambiguated * manually in the remap UI - this isn't a bug, it's a hard BLE limitation. */ export function autoMapDeviceSlots( slots: RecordingDeviceSlot[], connectedDevices: ConnectedDeviceInfo[], ): DeviceRemapEntry[] { const usedIndexes = new Set(); return slots.map((slot) => { const normalizedSlotName = slot.recordedBleName.trim().toLowerCase(); const exact = connectedDevices.find( (d) => !usedIndexes.has(d.index) && d.name.trim().toLowerCase() === normalizedSlotName, ); const partial = exact ?? connectedDevices.find( (d) => !usedIndexes.has(d.index) && (d.name.toLowerCase().includes(normalizedSlotName) || normalizedSlotName.includes(d.name.toLowerCase())), ); if (partial) usedIndexes.add(partial.index); return { slotLabel: slot.slotLabel, recordedBleName: slot.recordedBleName, matchedDeviceIndex: partial?.index ?? null, }; }); }