import { useEffect, useRef, useState } from 'react' import { datasetsApi } from '../services/api' import { formatError } from '../lib/formatError' import type { DatasetCreateResponse, VectorSelectionBBox, VectorSelectionResponse } from '../types' interface MapSelectionExtractOptions { selectedProjectId: string | null selectedDataset: DatasetCreateResponse | null isVectorDatasetType: (datasetType: string) => boolean } export function useMapSelectionExtract({ selectedProjectId, selectedDataset, isVectorDatasetType, }: MapSelectionExtractOptions) { const [mapSelectionBbox, setMapSelectionBbox] = useState(null) const [mapSelectionResult, setMapSelectionResult] = useState(null) const [mapSelectionLoading, setMapSelectionLoading] = useState(false) const [mapSelectionError, setMapSelectionError] = useState(null) const requestSequence = useRef(0) useEffect(() => { requestSequence.current += 1 setMapSelectionBbox(null) setMapSelectionLoading(false) }, [selectedProjectId]) useEffect(() => { requestSequence.current += 1 setMapSelectionResult(null) setMapSelectionError(null) setMapSelectionLoading(false) }, [selectedProjectId, selectedDataset?.id]) const runMapSelectionExtract = async (bbox: VectorSelectionBBox, areaId?: string) => { if (!selectedProjectId || !selectedDataset) { setMapSelectionError('Open a vector dataset before extracting a map area.') return null } if (!isVectorDatasetType(selectedDataset.dataset_type)) { setMapSelectionError('Area extraction requires an active vector dataset.') return null } const sequence = requestSequence.current + 1 requestSequence.current = sequence setMapSelectionLoading(true) setMapSelectionError(null) setMapSelectionBbox(bbox) try { const response = await datasetsApi.selectVectorFeatures(selectedProjectId, selectedDataset.id, { bbox: { ...bbox, crs: 'EPSG:4326' }, area_id: areaId, limit: 1000, }) if (requestSequence.current !== sequence) { return null } setMapSelectionResult(response) return response } catch (error) { if (requestSequence.current !== sequence) { return null } setMapSelectionResult(null) setMapSelectionError(formatError(error, 'Area extraction failed')) return null } finally { if (requestSequence.current === sequence) { setMapSelectionLoading(false) } } } const resetMapSelectionExtract = () => { requestSequence.current += 1 setMapSelectionBbox(null) setMapSelectionResult(null) setMapSelectionError(null) setMapSelectionLoading(false) } return { mapSelectionBbox, mapSelectionResult, mapSelectionLoading, mapSelectionError, runMapSelectionExtract, resetMapSelectionExtract, setMapSelectionBbox, } }