import { buildPreview } from './preview.mjs'; export function clonePlan(plan) { return JSON.parse(JSON.stringify(plan)); } export function refreshPlan(plan) { const normalized = normalizePlan(clonePlan(plan)); normalized.viewState = normalized.viewState || {}; normalized.viewState.preview = buildPreview(normalized); return normalized; } export function refreshServerPlan(plan) { const normalized = normalizePlan(clonePlan(plan)); normalized.viewState = normalized.viewState || {}; if (!normalized.viewState.preview) { normalized.viewState.preview = buildPreview(normalized); } return normalized; } export function normalizePlan(plan) { const normalized = clonePlan(plan); normalized.deliveries = normalized.deliveries || []; normalized.vehicles = normalized.vehicles || []; normalized.viewState = normalized.viewState || {}; const oldToNew = new Map(); normalized.deliveries = normalized.deliveries.map((delivery, index) => { oldToNew.set(delivery.id, index); return { kind: 'other', demand: 1, minStartTime: 0, maxEndTime: 24 * 3600, serviceDuration: 0, ...delivery, id: index, }; }); normalized.vehicles = normalized.vehicles.map((vehicle, index) => ({ ...vehicle, name: vehicle.name || `Vehicle ${index + 1}`, capacity: Number(vehicle.capacity || 0), homeLat: Number(vehicle.homeLat || 0), homeLng: Number(vehicle.homeLng || 0), departureTime: Number(vehicle.departureTime || 0), deliveryOrder: (vehicle.deliveryOrder || []) .map((oldId) => oldToNew.get(oldId)) .filter((value) => value !== undefined), id: index, })); return normalized; }