import { api } from "@/lib/api"; import { config } from "@/config/config"; import type { AdjustmentStatus, SensorPlacementScheme, SensorPoint, } from "./types"; export interface OptimizeSchemeInput { run_name: string; sensor_type: "pressure"; method: "sensitivity" | "kmeans"; sensor_count: number; min_diameter: number; } type SensorPlacementRunResponse = { run_id: string; name: string; sensor_count: number; min_diameter: number; created_by: string; created_at: string; sensor_locations: string[]; sensor_points: SensorPoint[]; can_edit: boolean; }; type SensorPlacementRunPage = { items: SensorPlacementRunResponse[]; total: number; limit: number; offset: number; }; const toSensorPlacementScheme = ( run: SensorPlacementRunResponse, ): SensorPlacementScheme => ({ id: run.run_id, scheme_name: run.name, sensor_number: run.sensor_count, min_diameter: run.min_diameter, username: run.created_by, create_time: run.created_at, sensor_location: run.sensor_locations, sensor_points: run.sensor_points, can_edit: run.can_edit, }); export const optimizeSensorPlacement = async ( input: OptimizeSchemeInput, ): Promise => { const response = await api.post( `${config.BACKEND_URL}/api/v1/sensor-placement-runs`, input, ); return toSensorPlacementScheme(response.data); }; export const listSensorPlacementSchemes = async (): Promise< SensorPlacementScheme[] > => { const response = await api.get< SensorPlacementRunPage | SensorPlacementRunResponse[] >( `${config.BACKEND_URL}/api/v1/sensor-placement-runs`, { params: { limit: 1000, offset: 0 } }, ); const runs = Array.isArray(response.data) ? response.data : response.data.items; return runs.map(toSensorPlacementScheme); }; export const getSensorPlacementScheme = async ( schemeId: string, ): Promise => { const response = await api.get( `${config.BACKEND_URL}/api/v1/sensor-placement-runs/${encodeURIComponent(schemeId)}`, ); return toSensorPlacementScheme(response.data); }; export const getSensorPlacementCandidate = async ( nodeId: string, ): Promise => { const response = await api.get( `${config.BACKEND_URL}/api/v1/sensor-placement-candidates/${encodeURIComponent(nodeId)}`, ); return response.data; }; export const overwriteSensorPlacementScheme = async ( schemeId: string, expectedSensorLocation: string[], sensorLocation: string[], ): Promise => { const response = await api.put( `${config.BACKEND_URL}/api/v1/sensor-placement-runs/${encodeURIComponent(schemeId)}`, { expected_sensor_locations: expectedSensorLocation, sensor_locations: sensorLocation, }, ); return toSensorPlacementScheme(response.data); }; export const exportSensorPlacementExcel = async ( schemeId: string, sensorLocation: string[], adjustmentStatus: Record, ) => { const response = await api.post( `${config.BACKEND_URL}/api/v1/sensor-placement-runs/${encodeURIComponent(schemeId)}/exports/excel`, { sensor_locations: sensorLocation, adjustment_status: adjustmentStatus, }, { responseType: "blob", }, ); return response.data; };