import type { MileageSummary } from './summary-api.js'; import type { OneOsDailyMileage } from './oneos-model.js'; import { buildPlateTargetNamesMap, dailyMileageMap, mergeMonitoringVehicles, type TargetRow } from './cache-model.js'; import type { CachedVehicle, VehicleInfoRow } from './types.js'; import { sourceCategoryFromProtocol } from './source-policy.js'; export function buildSummaryMileage(summary: MileageSummary, yesterdayRows: OneOsDailyMileage[], infoMap: Map, targets: TargetRow[], regions: Record): CachedVehicle[] { const byPlate = new Map(summary.vehicles.map(v => [v.plateNumber, v])); return mergeMonitoringVehicles([], infoMap, dailyMileageMap(yesterdayRows), buildPlateTargetNamesMap(targets), regions).map(vehicle => { const row = byPlate.get(vehicle.plate.trim().toUpperCase()); if (!row) return { ...vehicle, periodMileageKm: null }; const categories = new Set(row.sourceProtocols.map(sourceCategoryFromProtocol)); return { ...vehicle, vin: row.vin || vehicle.vin, dailyKm: row.periodMileageKm ?? 0, periodMileageKm: row.periodMileageKm, totalKm: row.endDateTotalMileageKm, validDays: row.validDays, missingDays: row.missingDays, anomalyDays: row.anomalyDays, qualityStatus: row.status, qualityReasons: row.qualityReasons, sourceProtocols: row.sourceProtocols, mileageAnomaly: row.anomalyDays ? row.qualityReasons.join(', ') || 'DATA_ANOMALY' : null, source: row.validDays > 0 ? 'ONEOS_API' : 'NONE', isDataSynced: row.validDays > 0, isOnline: row.periodMileageKm != null && row.periodMileageKm > 0, sourceProtocol: row.endDateSourceProtocol, sourceCategory: categories.size > 1 ? 'MIXED' : categories.values().next().value || null, dataTime: row.endDateDataTime, updatedAt: row.updatedAt, calculatedAt: null, }; }); }