import type { TEasingFn } from "../../Core/Animations/EasingFunctions";
import type { IIncludable } from "../../Core/IIncludable";
import type { ObservableArray } from "../../Core/ObservableArray";
import type { Thickness } from "../../Core/Thickness";
import type { TChartTitleStyle } from "../../types/TextStyle";
import type { TSciChart } from "../../types/TSciChart";
import type { RenderSurface } from "../Drawing/RenderSurface";
import type { WebGlRenderContext2D } from "../Drawing/WebGlRenderContext2D";
import type { LayoutManager } from "../LayoutManager/LayoutManager";
import type { IChartTitleRenderer } from "../Services/TitleRenderer";
import type { AxisBase2D } from "./Axis/AxisBase2D";
import type { ISciChartSubSurface } from "./ISciChartSubSurface";
import type { ISciChartSurfaceNative } from "./ISciChartSurfaceNative";
import type { IRenderableSeries } from "./RenderableSeries/IRenderableSeries";
export interface ISciChartSurface extends ISciChartSurfaceNative {
    /**
     * @summary Gets the collection of {@link AxisBase2D} - the X Axis on a {@link ISciChartSurface}
     * @description A {@link ISciChartSurface} can have one to many {@link AxisBase2D | XAxes}.
     *
     * Axis may be positioned on the left, right, top or bottom of the chart by using {@link AxisBase2D.axisAlignment}.
     *
     * XAxis may be positioned on the top/bottom (default) or left/right in the case of a rotated or vertical chart.
     *
     * Series and annotations may be linked to an axis via the {@link AxisCore.id}, {@link BaseRenderableSeries.xAxisId} and
     * {@link AnnotationBase.xAxisId} property.
     * @remarks
     * Adding an Axis to the chart causes it to automatically redraw. Note that Axis by default do not zoom to fit data.
     * See the {@link AxisBase2D.autoRange} property for more information.
     */
    readonly xAxes: ObservableArray<AxisBase2D>;
    /**
     * @summary Gets the collection of {@link AxisBase2D} - the Y Axis on a {@link ISciChartSurface}
     * @description A {@link ISciChartSurface} can have one to many {@link AxisBase2D | YAxes}.
     *
     * Axis may be positioned on the left, right, top or bottom of the chart by using {@link AxisBase2D.axisAlignment}.
     *
     * YAxis may be positioned on the left/right (default) or bottom/top in the case of a rotated or vertical chart.
     *
     * Series and annotations may be linked to an axis via the {@link AxisCore.id}, {@link BaseRenderableSeries.yAxisId} and
     * {@link AnnotationBase.yAxisId} property.
     * @remarks
     * Adding an Axis to the chart causes it to automatically redraw. Note that Axis by default do not zoom to fit data.
     * See the {@link AxisBase2D.autoRange} property for more information.
     */
    readonly yAxes: ObservableArray<AxisBase2D>;
    /**
     * @summary Gets the collection of {@link IRenderableSeries} - the chart types or series on this {@link ISciChartSurface}
     * @description A {@link ISciChartSurface} can have zero to many {@link IRenderableSeries | RenderableSeries}.
     *
     * The RenderableSeries are drawn as chart types, e.g. {@link FastLineRenderableSeries | Line series},
     * {@link XyScatterRenderableSeries | Scatter series}. Each RenderableSeries
     * must have a {@link BaseDataSeries | DataSeries}.
     *
     * Use this collection to add and remove series to the chart.
     * @remarks
     * Adding a series to the chart causes it to automatically redraw. To zoom to fit the data after adding a series, either set
     * {@link AxisCore.autoRange} or call {@link SciChartSurface.zoomExtents}
     */
    readonly renderableSeries: ObservableArray<IRenderableSeries>;
    /**
     * Gets the sub-chart counter value
     */
    readonly subChartCounter: number;
    /**
     * The {@link TSciChart | SciChart 2D WebAssembly Context} containing native methods and
     * access to our WebGL2 Engine and WebAssembly numerical methods
     */
    readonly webAssemblyContext2D: TSciChart;
    /**
     * Gets or sets the Padding between the {@link ISciChartSurface} and its inner elements, in order top, right, bottom, left
     */
    padding: Thickness;
    /**
     * Used internally - gets or sets the {@link LayoutManager}
     */
    layoutManager: LayoutManager;
    renderSurface: RenderSurface;
    /**
     * Gets or sets the title text style and placement for the SciChartSurface as {@link TChartTitleStyle}
     */
    titleStyle: TChartTitleStyle;
    /**
     * Controls the rendering of {@link SiCharSurface.title}
     */
    chartTitleRenderer: IChartTitleRenderer;
    isSubSurface: boolean;
    /**
     * @summary Zooms the {@link SciChartSurface} in the Y direction to extents of all data (zoom to fit)
     * @description
     * @param animationDurationMs An optional animation duration. Default value is 0, which means 'no animation'
     * @param easingFunction An optional easing function for animations. See {@link TEasingFn} for a list of values
     */
    zoomExtentsY(animationDurationMs?: number, easingFunction?: TEasingFn, axisSelectorFn?: (t: IIncludable) => boolean): void;
    /**
     * Gets the {@link AxisBase2D | XAxis} which matches the axisId. Returns undefined if not axis found
     * @param axisId The AxisId to search for
     */
    getXAxisById(axisId: string): AxisBase2D | undefined;
    /**
     * Gets the {@link AxisBase2D | YAxis} which matches the axisId. Returns undefined if no axis found
     * @param axisId The AxisId to search for
     */
    getYAxisById(axisId: string): AxisBase2D;
    /**
     * Gets the default {@link AxisBase2D | XAxis}, which is the first one X axis attached to the surface.
     */
    getDefaultXAxis(): AxisBase2D | undefined;
    /**
     * Gets the default {@link AxisBase2D | YAxis}, which is the first one Y axis attached to the surface.
     */
    getDefaultYAxis(): AxisBase2D;
    /**
     * Used internally - Adds a sub-chart
     */
    addSubChartInternal(subSurface: ISciChartSubSurface): void;
    /**
     * Runs the drawing loop. Get context and pass drawing to SciChartRenderer
     */
    doDrawingLoop(context: WebGlRenderContext2D | undefined): void;
    /**
     * Gets or sets the drawing order for surfaces and their subsurfaces.
     * This allows for a parent surface to draw over a subsurface.
     * This does not affect the drawing order of separate surfaces - use z-index on the container div to control that.
     */
    getSurfaceRenderOrder(): number;
}
