import type { CustomTrainData, OperationLogs } from "@/lib/CommonTypes"; import type { IconDisplayMode } from "@/lib/iconDisplayMode"; import { resolveOperationIconPair } from "@/lib/operationLogIcon"; import { resolveTrainDataIcon } from "@/lib/trainDataIcon"; export type TrainIconEntry = { vehicle_info_img: string; vehicle_info_right_img: string; vehicle_info_url: string; }; type TrainDataForIcon = Pick< CustomTrainData, "train_info_img" | "train_info_img_hub" | "vehicle_info_url" >; const extractOrderNumber = (trainId: string): number => { const parts = trainId.split(","); if (parts.length <= 1) return Infinity; const num = parseInt(parts[1].trim(), 10); return isNaN(num) ? Infinity : num; }; const findMatchingTrainId = ( operation: OperationLogs, trainNum: string, ): string | null => { const allTrainIds = [ ...(operation.train_ids || []), ...(operation.related_train_ids || []), ]; for (const trainId of allTrainIds) { const prefix = trainId.split(",")[0]; if (prefix === trainNum) return trainId; } return null; }; export const sortOperationsForTrainIcon = ( operations: OperationLogs[], trainNum: string, ): OperationLogs[] => [...operations].sort((a, b) => { const aTrainId = findMatchingTrainId(a, trainNum); const bTrainId = findMatchingTrainId(b, trainNum); if (!aTrainId || !bTrainId) { return aTrainId ? -1 : bTrainId ? 1 : 0; } return extractOrderNumber(aTrainId) - extractOrderNumber(bTrainId); }); export const resolveTrainIconEntries = ({ trainNum, customTrainData, todayOperation, iconDisplayMode, }: { trainNum: string; customTrainData: TrainDataForIcon; todayOperation: OperationLogs[]; iconDisplayMode: IconDisplayMode; }): TrainIconEntry[] => { const fallbackIcon = resolveTrainDataIcon(customTrainData, iconDisplayMode); if (todayOperation.length > 0) { return sortOperationsForTrainIcon(todayOperation, trainNum) .map((operation) => { const { forward, rear } = resolveOperationIconPair( operation, iconDisplayMode, fallbackIcon, ); return { vehicle_info_img: forward, vehicle_info_right_img: rear, vehicle_info_url: operation.vehicle_info_url, }; }) .filter((entry) => entry.vehicle_info_img || entry.vehicle_info_right_img); } if (!fallbackIcon) return []; return [ { vehicle_info_img: fallbackIcon, vehicle_info_right_img: fallbackIcon, vehicle_info_url: customTrainData.vehicle_info_url || "", }, ]; };