import type { fetchMonitoring } from '../api'; import type { MileageSourceGroup } from '../types'; export type MonitoringRequestParams = NonNullable[0]>; export interface MonitoringQueryModel { sortBy: 'today' | 'total' | 'statisticTime'; sortOrder: 'asc' | 'desc'; searchTerm: string; department: string; customer: string; project: string; entity: string; rentStatus: string; platePrefix: string; targetNames: string[]; region: string; plates: string[]; mileageRange: { min: string; max: string }; rangeStart: string; rangeEnd: string; brands: string[]; sourcePriority: MileageSourceGroup[]; } function optionalValue(value: string): string | undefined { return value || undefined; } function selectedValue(value: string): string | undefined { return value !== 'All' ? value : undefined; } function buildSharedQuery( model: MonitoringQueryModel, limit: number, page: number, ): MonitoringRequestParams { return { sortBy: model.sortBy, sortOrder: model.sortOrder, limit, page, search: optionalValue(model.searchTerm), dept: selectedValue(model.department), customer: selectedValue(model.customer), rentStatus: selectedValue(model.rentStatus), platePrefix: selectedValue(model.platePrefix), targetNames: model.targetNames.length > 0 ? model.targetNames : undefined, region: selectedValue(model.region), plate: model.plates.length > 0 ? model.plates.join(',') : undefined, startDate: optionalValue(model.rangeStart), endDate: optionalValue(model.rangeEnd), brands: model.brands.length > 0 ? model.brands : undefined, sourcePriority: model.sourcePriority, }; } function buildPagedQuery( model: MonitoringQueryModel, limit: number, page: number, ): MonitoringRequestParams { return { ...buildSharedQuery(model, limit, page), project: selectedValue(model.project), entity: selectedValue(model.entity), mileageMin: optionalValue(model.mileageRange.min), mileageMax: optionalValue(model.mileageRange.max), }; } export function buildInitialMonitoringQuery( model: MonitoringQueryModel, pageSize: number, ): MonitoringRequestParams { return buildPagedQuery(model, pageSize, 1); } export function buildNextPageMonitoringQuery( model: MonitoringQueryModel, pageSize: number, page: number, ): MonitoringRequestParams { return buildPagedQuery(model, pageSize, page); } export function buildExportMonitoringQuery(model: MonitoringQueryModel): MonitoringRequestParams { return buildPagedQuery(model, 9999, 1); } export function buildFullscreenMonitoringQuery(model: MonitoringQueryModel): MonitoringRequestParams { // Characterization boundary: fullscreen historically omits these four filters. // Keep project, entity, mileageMin and mileageMax out until a separate bug fix is approved. return buildSharedQuery(model, 9999, 1); }