export interface WagonSlotForPin { id: string; sequenceNo: number; physicalWagonId?: string | null; wagonType?: { id: string } | null; } export function autoFillWagonAssignments( slots: WagonSlotForPin[], wagonOptionsByType: Map>, existingAssignments: Record = {}, ): Record { const next: Record = {}; const assignedWagonIds = new Set(); for (const slot of slots) { const pinnedId = slot.physicalWagonId ?? existingAssignments[slot.id]; if (pinnedId) { next[slot.id] = pinnedId; assignedWagonIds.add(pinnedId); } } for (const slot of slots) { if (next[slot.id]) continue; const typeId = slot.wagonType?.id ?? ""; const options = wagonOptionsByType.get(typeId) ?? []; const availableWagon = options.find((option) => !assignedWagonIds.has(option.value)); if (availableWagon) { next[slot.id] = availableWagon.value; assignedWagonIds.add(availableWagon.value); } } return next; } export function countFilledSlots( slots: WagonSlotForPin[], assignments: Record, ): { filled: number; total: number; unfilledSlotNumbers: number[] } { const unfilledSlotNumbers: number[] = []; for (const slot of slots) { if (!assignments[slot.id]) { unfilledSlotNumbers.push(slot.sequenceNo); } } return { filled: slots.length - unfilledSlotNumbers.length, total: slots.length, unfilledSlotNumbers, }; }