export interface WagonSlotForPin {
  id: string;
  sequenceNo: number;
  physicalWagonId?: string | null;
  wagonType?: { id: string } | null;
}

export function autoFillWagonAssignments(
  slots: WagonSlotForPin[],
  wagonOptionsByType: Map<string, Array<{ value: string; label: string }>>,
  existingAssignments: Record<string, string> = {},
): Record<string, string> {
  const next: Record<string, string> = {};
  const assignedWagonIds = new Set<string>();

  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<string, string>,
): { 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,
  };
}
