import { apiGet, apiMultipart, apiPost } from './client' import type { DatasetCreateResponse, DatasetListResponse, RasterMetadataResponse, RasterInspectResponse, RasterStatsResponse, RasterPreviewResponse, JobRead, VectorBBoxResponse, VectorStatsResponse, VectorSelectionRequest, VectorSelectionDeriveRequest, VectorSelectionResponse, VectorSummary, RasterNdviRequest, RasterNdwiRequest, RasterNdbiRequest, OrthophotoAcquireRequest, OrthophotoProductRead, DhmvAcquireRequest, FloodHazardAcquireRequest, FloodHazardProductRead, FloodHazardSelectionResponse, BathymetryProfileAcquireRequest, BathymetrySourceRead, DhmvProductRead, TerrainSelectionResponse, ThematicRasterAcquireRequest, ThematicRasterProductRead, ThematicRasterSelectionResponse, SourceFreshnessReport, SourceCatalogProbeReport, GrbRefreshPlan, } from '../../types' const DATASET_PAGE_SIZE = 200 async function listProjectDatasets(projectId: string): Promise { const items: DatasetCreateResponse[] = [] let offset = 0 let total: number | null = null do { const page = await apiGet( `/api/v1/projects/${projectId}/datasets?limit=${DATASET_PAGE_SIZE}&offset=${offset}`, ) if (total === null) { total = page.total } else if (page.total !== total) { throw new Error('De datasetlijst wijzigde tijdens het laden. Vernieuw de werkruimte.') } items.push(...page.items) if (page.items.length === 0) { break } offset += page.items.length } while (offset < (total ?? 0)) if (total !== null && items.length !== total) { throw new Error(`Niet alle datasets konden worden geladen (${items.length}/${total}).`) } return { items, total: total ?? 0, limit: items.length, offset: 0 } } export const datasetsApi = { list: listProjectDatasets, sourceFreshness: (projectId: string): Promise => apiGet(`/api/v1/projects/${projectId}/datasets/source-freshness`), sourceCatalogProbes: (projectId: string, refresh = false): Promise => apiGet( `/api/v1/projects/${projectId}/datasets/source-catalog-probes?refresh=${refresh ? 'true' : 'false'}`, ), grbRefreshPlan: (projectId: string, refreshCatalog = false): Promise => apiGet( `/api/v1/projects/${projectId}/datasets/grb-refresh-plan?refresh_catalog=${refreshCatalog ? 'true' : 'false'}`, ), upload: ( projectId: string, payload: { file: File datasetType: string source: string datasetRole: string sourceName?: string referenceLayerName?: string sourceMetadataJson?: string provenanceMetadataJson?: string areaId?: string temporalSeriesKey?: string observedAt?: string validFrom?: string validTo?: string temporalGranularity?: string sourceVersion?: string }, ): Promise => { const form = new FormData() form.append('file', payload.file) form.append('dataset_type', payload.datasetType) form.append('source', payload.source) form.append('dataset_role', payload.datasetRole) if (payload.sourceName) { form.append('source_name', payload.sourceName) } if (payload.referenceLayerName) { form.append('reference_layer_name', payload.referenceLayerName) } if (payload.sourceMetadataJson) { form.append('source_metadata_json', payload.sourceMetadataJson) } if (payload.provenanceMetadataJson) { form.append('provenance_metadata_json', payload.provenanceMetadataJson) } if (payload.areaId) { form.append('area_id', payload.areaId) } if (payload.temporalSeriesKey) { form.append('temporal_series_key', payload.temporalSeriesKey) } if (payload.observedAt) { form.append('observed_at', payload.observedAt) } if (payload.validFrom) { form.append('valid_from', payload.validFrom) } if (payload.validTo) { form.append('valid_to', payload.validTo) } if (payload.temporalGranularity) { form.append('temporal_granularity', payload.temporalGranularity) } if (payload.sourceVersion) { form.append('source_version', payload.sourceVersion) } return apiMultipart(`/api/v1/projects/${projectId}/datasets/upload`, form) }, acquireOrthophoto: (projectId: string, payload: OrthophotoAcquireRequest): Promise => apiPost(`/api/v1/projects/${projectId}/datasets/orthophoto/acquire`, payload), listOrthophotoProducts: (projectId: string): Promise<{ items: OrthophotoProductRead[]; total: number }> => apiGet<{ items: OrthophotoProductRead[]; total: number }>(`/api/v1/projects/${projectId}/datasets/orthophoto/products`), orthophotoImageUrl: (projectId: string, datasetId: string): string => `/api/v1/projects/${projectId}/datasets/${datasetId}/raster/image`, acquireDhmv: (projectId: string, payload: DhmvAcquireRequest): Promise => apiPost(`/api/v1/projects/${projectId}/datasets/dhmv/acquire`, payload), listDhmvProducts: (projectId: string): Promise<{ items: DhmvProductRead[]; total: number }> => apiGet<{ items: DhmvProductRead[]; total: number }>(`/api/v1/projects/${projectId}/datasets/dhmv/products`), selectTerrain: ( projectId: string, datasetId: string, payload: { bbox: VectorSelectionRequest['bbox']; area_id?: string }, ): Promise => apiPost(`/api/v1/projects/${projectId}/datasets/${datasetId}/raster/terrain/select`, payload), selectTerrainPartitions: ( projectId: string, payload: { bbox: VectorSelectionRequest['bbox']; area_id?: string; product_key: string }, ): Promise => apiPost(`/api/v1/projects/${projectId}/datasets/raster/terrain/select`, payload), acquireFloodHazard: (projectId: string, payload: FloodHazardAcquireRequest): Promise => apiPost(`/api/v1/projects/${projectId}/datasets/flood-hazard/acquire`, payload), listFloodHazardProducts: (projectId: string): Promise<{ items: FloodHazardProductRead[]; total: number }> => apiGet<{ items: FloodHazardProductRead[]; total: number }>(`/api/v1/projects/${projectId}/datasets/flood-hazard/products`), selectFloodHazard: ( projectId: string, datasetId: string, payload: { bbox: VectorSelectionRequest['bbox']; area_id?: string }, ): Promise => apiPost(`/api/v1/projects/${projectId}/datasets/${datasetId}/raster/flood-hazard/select`, payload), selectFloodHazardPartitions: ( projectId: string, payload: { bbox: VectorSelectionRequest['bbox']; area_id?: string; product_key: string }, ): Promise => apiPost(`/api/v1/projects/${projectId}/datasets/raster/flood-hazard/select`, payload), listBathymetrySources: (projectId: string): Promise<{ items: BathymetrySourceRead[]; total: number }> => apiGet<{ items: BathymetrySourceRead[]; total: number }>( `/api/v1/projects/${projectId}/datasets/bathymetry/sources`, ), acquireBathymetryProfiles: (projectId: string, payload: BathymetryProfileAcquireRequest): Promise => apiPost(`/api/v1/projects/${projectId}/datasets/bathymetry/profiles/acquire`, payload), acquireThematicRaster: (projectId: string, payload: ThematicRasterAcquireRequest): Promise => apiPost(`/api/v1/projects/${projectId}/datasets/thematic-raster/acquire`, payload), listThematicRasterProducts: (projectId: string): Promise<{ items: ThematicRasterProductRead[]; total: number }> => apiGet<{ items: ThematicRasterProductRead[]; total: number }>(`/api/v1/projects/${projectId}/datasets/thematic-raster/products`), selectThematicRaster: ( projectId: string, datasetId: string, payload: { bbox: VectorSelectionRequest['bbox']; area_id?: string }, ): Promise => apiPost(`/api/v1/projects/${projectId}/datasets/${datasetId}/raster/thematic/select`, payload), refreshMetadata: (projectId: string, datasetId: string): Promise => apiPost(`/api/v1/projects/${projectId}/datasets/${datasetId}/metadata/refresh`, {}), inspectRaster: (projectId: string, datasetId: string): Promise => apiGet(`/api/v1/projects/${projectId}/datasets/${datasetId}/raster/inspect`), rasterStats: (projectId: string, datasetId: string): Promise => apiGet(`/api/v1/projects/${projectId}/datasets/${datasetId}/raster/stats`), inspectVector: (projectId: string, datasetId: string): Promise<{ dataset: DatasetCreateResponse; summary: VectorSummary | null; metadata: unknown }> => apiGet<{ dataset: DatasetCreateResponse; summary: VectorSummary | null; metadata: unknown }>( `/api/v1/projects/${projectId}/datasets/${datasetId}/vector/inspect`, ), vectorBbox: (projectId: string, datasetId: string): Promise => apiGet(`/api/v1/projects/${projectId}/datasets/${datasetId}/vector/bbox`), vectorSummary: (projectId: string, datasetId: string): Promise => apiGet(`/api/v1/projects/${projectId}/datasets/${datasetId}/vector/summary`), vectorStats: (projectId: string, datasetId: string): Promise => apiGet(`/api/v1/projects/${projectId}/datasets/${datasetId}/vector/stats`), selectVectorFeatures: (projectId: string, datasetId: string, payload: VectorSelectionRequest): Promise => apiPost(`/api/v1/projects/${projectId}/datasets/${datasetId}/vector/select`, payload), deriveVectorSelection: (projectId: string, datasetId: string, payload: VectorSelectionDeriveRequest): Promise => apiPost(`/api/v1/projects/${projectId}/datasets/${datasetId}/vector/select/derive`, payload), vectorClip: (projectId: string, datasetId: string, payload: { area_id: string; output_name?: string }) => apiPost(`/api/v1/projects/${projectId}/datasets/${datasetId}/vector/clip`, payload), vectorBuffer: (projectId: string, datasetId: string, payload: { distance_m: number; dissolve?: boolean; output_name?: string }) => apiPost(`/api/v1/projects/${projectId}/datasets/${datasetId}/vector/buffer`, payload), vectorIntersect: (projectId: string, datasetId: string, payload: { other_dataset_id: string; output_name?: string }) => apiPost(`/api/v1/projects/${projectId}/datasets/${datasetId}/vector/intersect`, payload), rasterMetadata: (projectId: string, datasetId: string): Promise => apiGet(`/api/v1/projects/${projectId}/datasets/${datasetId}/raster/metadata`), rasterInspect: (projectId: string, datasetId: string): Promise => apiGet(`/api/v1/projects/${projectId}/datasets/${datasetId}/raster/inspect`), rasterTile: ( projectId: string, datasetId: string, payload: { tile_size?: number; overlap?: number; output_name?: string } = {}, ): Promise => apiPost(`/api/v1/projects/${projectId}/datasets/${datasetId}/raster/tile`, payload), rasterReproject: ( projectId: string, datasetId: string, payload: { target_crs: string; resampling?: string; output_name?: string }, ): Promise => apiPost(`/api/v1/projects/${projectId}/datasets/${datasetId}/raster/reproject`, payload), rasterNdvi: (projectId: string, datasetId: string, payload: RasterNdviRequest): Promise => apiPost(`/api/v1/projects/${projectId}/datasets/${datasetId}/raster/indices/ndvi`, payload), rasterNdwi: (projectId: string, datasetId: string, payload: RasterNdwiRequest): Promise => apiPost(`/api/v1/projects/${projectId}/datasets/${datasetId}/raster/indices/ndwi`, payload), rasterNdbi: (projectId: string, datasetId: string, payload: RasterNdbiRequest): Promise => apiPost(`/api/v1/projects/${projectId}/datasets/${datasetId}/raster/indices/ndbi`, payload), rasterPreview: (projectId: string, datasetId: string): Promise => apiGet(`/api/v1/projects/${projectId}/datasets/${datasetId}/raster/preview`), rasterClip: ( projectId: string, datasetId: string, payload: { area_id: string; output_name?: string }, ): Promise => apiPost(`/api/v1/projects/${projectId}/datasets/${datasetId}/raster/clip`, payload), getContent: (projectId: string, datasetId: string): Promise => apiGet(`/api/v1/projects/${projectId}/datasets/${datasetId}/content`), }