import { useState } from 'react' import { exportsApi } from '../services/api' import type { DatasetCreateResponse, ExportCreateResponse, ExportRead, MapResultExportRequest, VectorSelectionBBox, } from '../types' import { formatError } from '../lib/formatError' interface ExportWorkflowOptions { selectedProjectId: string | null selectedDataset: DatasetCreateResponse | null selectedDetectionRunId: string selectedSegmentationRunId: string isVectorDatasetType: (datasetType: string) => boolean } export function useExportWorkflow({ selectedProjectId, selectedDataset, selectedDetectionRunId, selectedSegmentationRunId, isVectorDatasetType, }: ExportWorkflowOptions) { const [exports, setExports] = useState([]) const [latestExport, setLatestExport] = useState(null) const [exportError, setExportError] = useState(null) const [loadingExports, setLoadingExports] = useState(false) const [exporting, setExporting] = useState(false) const [selectionExporting, setSelectionExporting] = useState(false) const [selectionExportError, setSelectionExportError] = useState(null) const [latestSelectionExport, setLatestSelectionExport] = useState(null) const [exportPreview, setExportPreview] = useState | null>(null) const loadExports = async (projectId = selectedProjectId) => { if (!projectId) { setExports([]) return } setLoadingExports(true) setExportError(null) try { const response = await exportsApi.listProjectExports(projectId) setExports(response.items) } catch (error) { setExportError(formatError(error, 'Failed to load exports')) } finally { setLoadingExports(false) } } const exportSelectedDatasetGeoJson = async () => { if (!selectedDataset || !isVectorDatasetType(selectedDataset.dataset_type)) { setExportError('Select a vector dataset before exporting GeoJSON.') return } setExporting(true) setExportError(null) try { const response = await exportsApi.exportGeojson({ dataset_id: selectedDataset.id, export_kind: 'dataset', name: selectedDataset.name.replace(/\.(geo)?json$/i, ''), }) setLatestExport(response) await loadExports(selectedDataset.project_id) } catch (error) { setExportError(formatError(error, 'Failed to export selected dataset')) } finally { setExporting(false) } } const exportSelectedDetectionRunGeoJson = async () => { if (!selectedDetectionRunId) { setExportError('Select a detection run before exporting GeoJSON.') return } setExporting(true) setExportError(null) try { const response = await exportsApi.exportGeojson({ analysis_run_id: selectedDetectionRunId, export_kind: 'detection_run', }) setLatestExport(response) await loadExports(selectedProjectId) } catch (error) { setExportError(formatError(error, 'Failed to export detection run')) } finally { setExporting(false) } } const exportSelectedSegmentationRunGeoJson = async () => { if (!selectedSegmentationRunId) { setExportError('Select a segmentation run before exporting GeoJSON.') return } setExporting(true) setExportError(null) try { const response = await exportsApi.exportGeojson({ analysis_run_id: selectedSegmentationRunId, export_kind: 'segmentation_run', }) setLatestExport(response) await loadExports(selectedProjectId) } catch (error) { setExportError(formatError(error, 'Failed to export segmentation run')) } finally { setExporting(false) } } const exportMapSelectionGeoJson = async (bbox: VectorSelectionBBox, areaId?: string) => { if (!selectedDataset || !isVectorDatasetType(selectedDataset.dataset_type)) { setSelectionExportError('Select a vector dataset before saving an area export.') return null } setSelectionExporting(true) setSelectionExportError(null) try { const response = await exportsApi.exportGeojson({ dataset_id: selectedDataset.id, area_id: areaId, export_kind: 'vector_selection', bbox: { ...bbox, crs: 'EPSG:4326' }, limit: 250, name: `${selectedDataset.name.replace(/\.(geo)?json$/i, '')}-selection`, }) setLatestExport(response) setLatestSelectionExport(response) await loadExports(selectedDataset.project_id) return response } catch (error) { setSelectionExportError(formatError(error, 'Failed to save area export')) return null } finally { setSelectionExporting(false) } } const exportProjectMetadata = async () => { if (!selectedProjectId) { setExportError('Select a project before exporting metadata.') return } setExporting(true) setExportError(null) try { const response = await exportsApi.exportProjectMetadata(selectedProjectId) setLatestExport(response) await loadExports(selectedProjectId) } catch (error) { setExportError(formatError(error, 'Failed to export project metadata')) } finally { setExporting(false) } } const exportProjectReport = async () => { if (!selectedProjectId) { setExportError('Select a project before exporting a report.') return } setExporting(true) setExportError(null) try { const response = await exportsApi.exportProjectReport(selectedProjectId) setLatestExport(response) await loadExports(selectedProjectId) } catch (error) { setExportError(formatError(error, 'Failed to export project report')) } finally { setExporting(false) } } const persistMapResult = async (payload: MapResultExportRequest) => { setSelectionExporting(true) setSelectionExportError(null) try { const response = await exportsApi.exportMapResult(payload) setLatestExport(response) setLatestSelectionExport(response) await loadExports(payload.project_id) return response } catch (error) { setSelectionExportError(formatError(error, 'Het kaartresultaat kon niet worden bewaard.')) return null } finally { setSelectionExporting(false) } } const previewExportContent = async (exportId: string) => { setExportError(null) try { const response = await exportsApi.getContent(exportId) setExportPreview(response.content) } catch (error) { setExportError(formatError(error, 'Failed to load export content')) } } const downloadExportArtifact = (exportId: string) => { window.open(exportsApi.downloadUrl(exportId), '_blank', 'noopener,noreferrer') } const resetExportsForProject = () => { setExports([]) setLatestExport(null) setLatestSelectionExport(null) setSelectionExportError(null) setExportPreview(null) } return { exports, latestExport, exportError, loadingExports, exporting, selectionExporting, selectionExportError, latestSelectionExport, exportPreview, loadExports, exportSelectedDatasetGeoJson, exportSelectedDetectionRunGeoJson, exportSelectedSegmentationRunGeoJson, exportMapSelectionGeoJson, persistMapResult, exportProjectMetadata, exportProjectReport, previewExportContent, downloadExportArtifact, resetExportsForProject, } }