import { type AgCandlestickSeriesItemOptions, type AgOhlcSeriesItemOptions, type AgOhlcSeriesItemType, _ModuleSupport } from 'ag-charts-community';
import type { AgOhlcSeriesBaseOptions, SelectionState } from 'ag-charts-community';
import { ChartAxisDirection, type DynamicContext, type FillStrokeMorph, type Normalised } from 'ag-charts-core';
import type { AgNumericValue } from 'ag-charts-types';
import { OhlcBaseNode } from './ohlcNode';
import type { OhlcSeriesBaseProperties } from './ohlcSeriesProperties';
interface OhlcCandleStickSeriesStyle extends AgCandlestickSeriesItemOptions, AgOhlcSeriesItemOptions {
}
/** Post-resolution style: colour refs are resolved to concrete colours before reaching the scene node. */
type NormalisedOhlcCandleStickSeriesStyle = Normalised<OhlcCandleStickSeriesStyle, never, FillStrokeMorph>;
export interface OhlcNodeDatum extends Omit<_ModuleSupport.CartesianSeriesNodeDatum, 'yKey' | 'yValue'> {
    readonly itemId?: never;
    readonly itemType: AgOhlcSeriesItemType;
    readonly openValue: AgNumericValue;
    readonly closeValue: AgNumericValue;
    readonly highValue?: AgNumericValue;
    readonly lowValue?: AgNumericValue;
    readonly aggregatedValue: AgNumericValue;
    readonly isRising: boolean;
    readonly centerX: number;
    readonly width: number;
    readonly y: number;
    readonly height: number;
    readonly yOpen: number;
    readonly yClose: number;
    readonly crisp: boolean;
    style?: Required<NormalisedOhlcCandleStickSeriesStyle>;
}
declare class OhlcSeriesNodeEvent<TEvent extends string = _ModuleSupport.SeriesNodeEventTypes> extends _ModuleSupport.SeriesNodeEvent<OhlcNodeDatum, TEvent> {
    readonly xKey?: string;
    readonly openKey?: string;
    readonly closeKey?: string;
    readonly highKey?: string;
    readonly lowKey?: string;
    constructor(type: TEvent, nativeEvent: Event, datum: OhlcNodeDatum, series: OhlcSeriesBase<OhlcSeriesBaseTypes>, selectionState: SelectionState | undefined);
}
interface OhlcSeriesBaseNodeDataContext extends _ModuleSupport.AbstractBarSeriesNodeDataContext<OhlcNodeDatum> {
    styles: Record<'up' | 'down', _ModuleSupport.SeriesNodeStyleContext<NormalisedOhlcCandleStickSeriesStyle>>;
}
/**
 * Base type interface for OHLC series types.
 * Template parameter TNode allows subclasses to specify their node type.
 */
export interface OhlcSeriesBaseTypes extends _ModuleSupport.AbstractBarSeriesTypes {
    readonly node: OhlcBaseNode<OhlcNodeDatum>;
    readonly options: AgOhlcSeriesBaseOptions;
    readonly properties: OhlcSeriesBaseProperties<this['options']>;
    readonly datum: OhlcNodeDatum;
    readonly label: OhlcNodeDatum;
    readonly context: OhlcSeriesBaseNodeDataContext;
}
export declare abstract class OhlcSeriesBase<TTypes extends OhlcSeriesBaseTypes> extends _ModuleSupport.AbstractBarSeries<TTypes> {
    protected readonly NodeEvent: typeof OhlcSeriesNodeEvent;
    private readonly aggregationManager;
    constructor(moduleCtx: DynamicContext<_ModuleSupport.ChartRegistry>);
    processData(dataController: _ModuleSupport.DataController): Promise<void>;
    private aggregateData;
    private estimateTargetRange;
    protected createBucketLookupFeature(): _ModuleSupport.BucketLookupFeature;
    getSeriesDomain(direction: ChartAxisDirection): import("ag-charts-core").DomainWithMetadata<any>;
    getSeriesRange(_direction: ChartAxisDirection, visibleRange: [number, number]): [number, number];
    getZoomRangeFittingItems(xVisibleRange: [number, number], yVisibleRange: [number, number] | undefined, minVisibleItems: number): {
        x: [number, number];
        y: [number, number] | undefined;
    } | undefined;
    getVisibleItems(xVisibleRange: [number, number], yVisibleRange: [number, number] | undefined, minVisibleItems: number): number;
    /**
     * Creates shared context for node datum creation/update operations.
     * This context is instantiated once and reused across all datum operations
     * to minimize memory allocations. Only caches values that are expensive to
     * compute - cheap property lookups use `this` directly.
     */
    private buildDatumContext;
    /**
     * Validates and prepares state for a single OHLC datum.
     * Mutates ctx.nodeDatumStateScratch with computed values.
     * Returns the scratch object if valid, undefined if invalid.
     */
    private prepareOhlcNodeDatumState;
    /**
     * Creates a skeleton OhlcNodeDatum from prepared state.
     * Takes pre-computed positioning and state from scratch object.
     */
    private createSkeletonNodeDatum;
    /**
     * Updates an existing OhlcNodeDatum in-place for value-only changes.
     * This is more efficient than recreating the entire node when only data values change
     * but the structure (insertions/removals) remains the same.
     */
    private updateNodeDatum;
    /**
     * Handles node creation/update - reuses existing nodes when possible for incremental updates.
     * This method decides whether to update existing nodes in-place or create new ones.
     */
    private upsertNodeDatum;
    createNodeData(): {
        itemId: string;
        nodeData: OhlcNodeDatum[];
        labelData: never[];
        scales: {
            x?: import("ag-charts-core").Scaling | undefined;
            y?: import("ag-charts-core").Scaling | undefined;
            angle?: import("ag-charts-core").Scaling | undefined;
            radius?: import("ag-charts-core").Scaling | undefined;
        };
        groupScale: import("ag-charts-core").Scaling | undefined;
        visible: boolean;
        styles: Record<"up" | "down", Record<_ModuleSupport.HighlightState, Required<NormalisedOhlcCandleStickSeriesStyle> & {
            opacity: number;
        }>>;
    } | undefined;
    protected isVertical(): boolean;
    protected isLabelEnabled(): boolean;
    protected resetDatumAnimation(data: _ModuleSupport.CartesianAnimationData<OhlcNodeDatum, TTypes['node'], OhlcNodeDatum, OhlcSeriesBaseNodeDataContext>): void;
    protected updateDatumSelection(opts: {
        nodeData: OhlcNodeDatum[];
        datumSelection: _ModuleSupport.Selection<OhlcNodeDatum, TTypes['node']>;
        seriesIdx: number;
    }): _ModuleSupport.Selection<OhlcNodeDatum, TTypes["node"]>;
    protected updateLabelNodes(_opts: {
        labelSelection: _ModuleSupport.Selection<OhlcNodeDatum, _ModuleSupport.Text<OhlcNodeDatum>>;
        seriesIdx: number;
    }): void;
    protected updateLabelSelection(opts: {
        labelData: OhlcNodeDatum[];
        labelSelection: _ModuleSupport.Selection<OhlcNodeDatum, _ModuleSupport.Text<OhlcNodeDatum>>;
        seriesIdx: number;
    }): _ModuleSupport.Selection<OhlcNodeDatum, _ModuleSupport.Text<OhlcNodeDatum>>;
    protected getItemStyle(datumIndex: number | undefined, isHighlight: boolean, highlightState?: _ModuleSupport.HighlightState, itemType?: 'up' | 'down'): Required<NormalisedOhlcCandleStickSeriesStyle> & {
        opacity: number;
    };
    private makeItemStylerParams;
    getTooltipContent(datumIndex: number): _ModuleSupport.TooltipContent | undefined;
    computeFocusBounds(opts: _ModuleSupport.PickFocusInputs): _ModuleSupport.BBox | undefined;
}
export {};
