import { API_ENDPOINTS } from "@/api/config"; import { EntityBatchChange } from "@/api/entities"; import { requestJson } from "@/api/http"; import { Change, FeatureCollection, Geometry } from "@/lib/useEditorState"; export type GeometriesBBoxQuery = { minLng: number; minLat: number; maxLng: number; maxLat: number; time?: number; entity_id?: string; }; export type GeometryCreatePayload = { geometry: Geometry; type?: string | null; time_start?: number | null; time_end?: number | null; binding?: string[]; entity_id?: string | null; entity_ids?: string[]; }; export type GeometryUpdatePayload = { geometry: Geometry; type?: string | null; time_start?: number | null; time_end?: number | null; binding?: string[]; entity_id?: string | null; entity_ids?: string[]; }; export type GeometryCreateResponse = { id: string; }; export type BatchSaveResponse = { success: boolean; applied: number; }; export type CombinedBatchSaveResponse = { success: boolean; applied: number; entity_applied: number; geometry_applied: number; created_entity_ids: string[]; }; function buildBBoxQueryString(params: GeometriesBBoxQuery): string { const query = new URLSearchParams({ minLng: String(params.minLng), minLat: String(params.minLat), maxLng: String(params.maxLng), maxLat: String(params.maxLat), }); if (params.time !== undefined) { query.set("time", String(params.time)); } if (params.entity_id) { query.set("entity_id", params.entity_id); } return query.toString(); } export async function fetchGeometriesByBBox(params: GeometriesBBoxQuery): Promise { const url = `${API_ENDPOINTS.geometries}?${buildBBoxQueryString(params)}`; return requestJson(url); } export async function saveGeometryBatchChanges(changes: Change[]): Promise { return requestJson(API_ENDPOINTS.geometriesBatch, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ changes }), }); } export async function saveCombinedGeometryEntityBatchChanges( entityChanges: EntityBatchChange[], geometryChanges: Change[] ): Promise { return requestJson(API_ENDPOINTS.geometriesBatchCombined, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ entity_changes: entityChanges, geometry_changes: geometryChanges, }), }); } export async function createGeometry(payload: GeometryCreatePayload): Promise { return requestJson(API_ENDPOINTS.geometries, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(payload), }); } export async function updateGeometry(id: string | number, payload: GeometryUpdatePayload): Promise<{ success: boolean }> { return requestJson<{ success: boolean }>(`${API_ENDPOINTS.geometries}/${id}`, { method: "PUT", headers: { "Content-Type": "application/json" }, body: JSON.stringify(payload), }); } export async function deleteGeometry(id: string | number): Promise<{ success: boolean }> { return requestJson<{ success: boolean }>(`${API_ENDPOINTS.geometries}/${id}`, { method: "DELETE", }); }