import type { ZoomTransform } from "d3-zoom";
import { type Quadtree } from "d3-quadtree";
import type { GeoPipelineConfig, GeoScales, GeoSceneNode } from "./geoTypes";
import type { PointSceneNode, StreamLayout } from "./types";
import type { ActiveTransition } from "./pipelineTransitionUtils";
import type { Datum } from "../charts/shared/datumTypes";
export declare class GeoPipelineStore {
    config: GeoPipelineConfig;
    scene: GeoSceneNode[];
    scales: GeoScales | null;
    version: number;
    private static readonly QUADTREE_THRESHOLD;
    private _quadtree;
    /** Largest visual point radius in the current scene; used to widen quadtree
     *  hit-test radius when points are larger than the default maxDistance. */
    private _maxPointRadius;
    private projection;
    private geoPath;
    private baseScale;
    private baseTranslate;
    private baseRotation;
    currentZoom: number;
    cartogramLayout: {
        cx: number;
        cy: number;
        maxCost: number;
        availableRadius: number;
    } | null;
    private areas;
    private pointData;
    private lineData;
    private pointBuffer;
    private streaming;
    lastIngestTime: number;
    private timestampBuffer;
    activeTransition: ActiveTransition | null;
    private prevPositions;
    private _hasRenderedOnce;
    constructor(config: GeoPipelineConfig);
    updateConfig(config: Partial<GeoPipelineConfig>): void;
    setAreas(features: GeoJSON.Feature[]): void;
    setPoints(data: Datum[]): void;
    setLines(data: Datum[]): void;
    /** Initialize streaming mode with a ring buffer */
    initStreaming(windowSize?: number): void;
    /** Push a single streaming point */
    pushPoint(datum: Datum): void;
    /** Push multiple streaming points */
    pushMany(data: Datum[]): void;
    /**
     * Remove points by ID. Requires pointIdAccessor to be configured.
     * Returns the removed items.
     */
    removePoint(id: string | string[]): Datum[];
    clear(): void;
    computeScene(layout: StreamLayout): void;
    private fitProjection;
    /**
     * Apply a d3-zoom transform to the projection.
     * Called on zoom end — updates projection scale/translate and rebuilds scene.
     */
    applyZoomTransform(transform: ZoomTransform, layout: StreamLayout): void;
    /**
     * Apply zoom as scale-only (no translate shift).
     * Used in drag-rotate mode to prevent globe drift on zoom.
     */
    applyZoomScale(k: number, layout: StreamLayout): void;
    /**
     * Apply a rotation to the projection and rebuild the scene.
     * Called during drag-rotate gestures (orthographic globe spinning).
     */
    applyRotation(rotation: [number, number, number], layout: StreamLayout): void;
    /**
     * Set the projection rotation without rebuilding the scene.
     * Use when rotation will be followed by another operation that rebuilds
     * (e.g., applyZoomScale), to avoid redundant scene builds.
     */
    setRotation(rotation: [number, number, number]): void;
    /** Get current rotation (for external tracking) */
    getRotation(): [number, number, number];
    /** Get the current base projection state (for zoom reset) */
    getBaseProjectionState(): {
        scale: number;
        translate: [number, number];
    };
    getPoints(): Datum[];
    /**
     * Build (or clear) the quadtree spatial index for point scene nodes.
     * Only built when the point count exceeds QUADTREE_THRESHOLD; below that
     * a linear scan is faster than indexing overhead. Also tracks the largest
     * point radius so the hit tester can widen its query when symbols are big.
     */
    private rebuildQuadtree;
    /** Quadtree spatial index for point hit testing, or null when below threshold. */
    get quadtree(): Quadtree<PointSceneNode> | null;
    /** Largest visual point radius in the current scene. */
    get maxPointRadius(): number;
    private buildSceneNodes;
    private applyCartogramTransform;
    private applyDecay;
    private applyPulse;
    get hasActivePulses(): boolean;
    private startTransition;
    advanceTransition(now: number): boolean;
}
