import { IDeletable } from "../../../Core/IDeletable";
import { IHoverable } from "../../../Core/IHoverable";
import { IWithXYAxes } from "../../../Core/IWithXYAxes";
import type { Point } from "../../../Core/Point";
import { ESurfaceType } from "../../../types/SurfaceType";
import { AxisBase2D } from "../Axis/AxisBase2D";
import { SciChartSurfaceBase } from "../SciChartSurfaceBase";
import { INotifyOnDpiChanged } from "../TextureManager/DpiHelper";
import { ECoordinateMode } from "./AnnotationBase";
import { EAnnotationClippingMode } from "../../../types/AnnotationClippingMode";
import { IOrderedRenderable } from "../../../types/OrderedRenderable";
/**
 * Defines the layer where {@link IAnnotation | Annotations} are drawn
 * when added to the {@link SciChartSurface.annotations} collection
 */
export declare enum EAnnotationLayer {
    /**
     * The {@link IAnnotation | Annotation} will be displayed above the chart series and grid
     * @remarks
     * This is the default value for {@link IAnnotation | Annotations}
     */
    AboveChart = "AboveChart",
    /**
     * The {@link IAnnotation | Annotation} will be displayed below the chart series and grid.
     * @remarks
     * Doesn't work with SVG (Custom) annotations.
     *
     * Use this for watermarks, e.g. showing an image or text behind the chart.
     * The Grid lines and Axis Bands will show over the annotation,
     * so consider setting {@link AxisCore.axisBandsFill} to a semi-transparent color to avoid this.
     */
    BelowChart = "BelowChart",
    /**
     * The {@link IAnnotation | Annotation} will be displayed below the chart grid lines, bands, and axes.
     * @remarks
     * Use this for custom background behind the chart.
     */
    Background = "Background"
}
/**
 * Defines the type of {@link IAnnotation Annotation}.
 * Annotations are overlays or markers added to the {@link SciChartSurface.annotations} collection
 */
export declare enum EAnnotationType {
    /**
     * The Annotation is an {@link SvgAnnotationBase | SvgAnnotation}
     * @remarks
     * {@link SvgAnnotationBase | SvgAnnotations} are drawn using SVG where available.
     * This allows for more flexible annotations over the
     * {@link https://www.scichart.com/javascript-chart-features | Javascript Chart},
     * such as text or other custom shapes
     * This is a base type for various internal annotations.  Do not use in Chart Builder
     */
    SVG = "SVG",
    /**
     * The Annotation is an {@link BoxAnnotation | BoxAnnotation}
     * @remarks
     * {@link BoxAnnotation | BoxAnnotation} * are drawn on the
     * {@link https://www.scichart.com/javascript-chart-features | Javascript chart} using WebGL2 where available.
     * They differ from {@link SvgAnnotationBase | SvgAnnotations} which use slower,
     * but more flexible SVG to draw annotations on the chart
     */
    RenderContextBoxAnnotation = "RenderContextBoxAnnotation",
    /**
     * The Annotation is an {@link LineAnnotation | LineAnnotation}
     * @remarks
     * {@link LineAnnotation | BoxAnnotation} * are drawn on the
     * {@link https://www.scichart.com/javascript-chart-features | Javascript chart} using WebGL2 where available.
     * They differ from {@link SvgAnnotationBase | SvgAnnotations} which use slower,
     * but more flexible SVG to draw annotations on the chart
     */
    RenderContextLineAnnotation = "RenderContextLineAnnotation",
    /**
     * The Annotation is an {@link HorizontalLineAnnotation | HorizontalLineAnnotation}
     * @remarks
     * {@link HorizontalLineAnnotation | HorizontalLineAnnotation} * are drawn on the
     * {@link https://www.scichart.com/javascript-chart-features | Javascript chart} using WebGL2 where available.
     * They differ from {@link SvgAnnotationBase | SvgAnnotations} which use slower,
     * but more flexible SVG to draw annotations on the chart
     */
    RenderContextHorizontalLineAnnotation = "RenderContextHorizontalLineAnnotation",
    /**
     * The Annotation is an {@link VerticalLineAnnotation | VerticalLineAnnotation}
     * @remarks
     * {@link VerticalLineAnnotation | VerticalLineAnnotation} * are drawn on the
     * {@link https://www.scichart.com/javascript-chart-features | Javascript chart} using WebGL2 where available.
     * They differ from {@link SvgAnnotationBase | SvgAnnotations} which use slower,
     * but more flexible SVG to draw annotations on the chart
     */
    RenderContextVerticalLineAnnotation = "RenderContextVerticalLineAnnotation",
    /**
     * The Annotation is an {@link LineArrowAnnotation | LineArrowAnnotation}
     * @remarks
     * {@link LineArrowAnnotation | LineArrowAnnotation} * are drawn on the
     * {@link https://www.scichart.com/javascript-chart-features | Javascript chart} using WebGL2 where available.
     * They differ from {@link SvgAnnotationBase | SvgAnnotations} which use slower,
     * but more flexible SVG to draw annotations on the chart
     */
    RenderContextLineArrowAnnotation = "RenderContextLineArrowAnnotation",
    /**
     * The Annotation is an {@link ArcAnnotation | ArcAnnotation}
     * @remarks
     * {@link ArcAnnotation | ArcAnnotation} * are drawn on the
     * {@link https://www.scichart.com/javascript-chart-features | Javascript chart} using WebGL2 where available.
     * They differ from {@link SvgAnnotationBase | SvgAnnotations} which use slower,
     * but more flexible SVG to draw annotations on the chart
     */
    RenderContextArcAnnotation = "RenderContextArcAnnotation",
    RenderContextPolarArcAnnotation = "RenderContextPolarArcAnnotation",
    /**
     * The Annotation is an {@link AxisMarkerAnnotation | AxisMarkerAnnotation}
     * @remarks
     * {@link AxisMarkerAnnotation | AxisMarkerAnnotation} * are drawn on the
     * {@link https://www.scichart.com/javascript-chart-features | Javascript chart} using WebGL2 where available.
     * They differ from {@link SvgAnnotationBase | SvgAnnotations} which use slower,
     * but more flexible SVG to draw annotations on the chart
     */
    RenderContextAxisMarkerAnnotation = "RenderContextAxisMarkerAnnotation",
    /**
     * The Annotation is an {@link NativeTextAnnotation | NativeTextAnnotation}
     * @remarks
     * {@link NativeTextAnnotation | NativeTextAnnotation} * are drawn on the
     * {@link https://www.scichart.com/javascript-chart-features | Javascript chart} using WebGL2 where available.
     * They differ from {@link TextAnnotation | TextAnnotation} which use slower,
     * but more flexible SVG to draw annotations on the chart
     */
    RenderContextNativeTextAnnotation = "RenderContextNativeTextAnnotation",
    /**
     * The Annotation is a custom RenderContext annotation. Use this type to create custom RenderContext annotations.
     * @remarks
     * {@link Custom RenderContext annotation | NativeTextAnnotation} * are drawn on the
     * {@link https://www.scichart.com/javascript-chart-features | Javascript chart} using WebGL2 where available.
     */
    RenderContextCustomAnnotation = "RenderContextCustomAnnotation",
    /**
     * The Annotation is an {@link TextAnnotation | TextAnnotation}
     * @remarks
     * {@link SvgAnnotationBase | SvgAnnotations} are drawn using SVG where available.
     * This allows for more flexible annotations over the
     * {@link https://www.scichart.com/javascript-chart-features | Javascript Chart},
     * such as text or other custom shapes
     */
    SVGTextAnnotation = "SVGTextAnnotation",
    /**
     * The Annotation is an {@link CustomAnnotation | CustomAnnotation}
     * @remarks
     * {@link SvgAnnotationBase | SvgAnnotations} are drawn using SVG where available.
     * This allows for more flexible annotations over the
     * {@link https://www.scichart.com/javascript-chart-features | Javascript Chart},
     * such as text or other custom shapes
     */
    SVGCustomAnnotation = "SVGCustomAnnotation",
    /**
     * The Annotation is an {@link PolarPointerAnnotation | PolarPointerAnnotation}
     * @remarks
     * {@link SvgAnnotationBase | SvgAnnotations} are drawn using SVG where available.
     * This allows for more flexible annotations over the
     * {@link https://www.scichart.com/javascript-chart-features | Javascript Chart},
     * such as text or other custom shapes
     */
    SVGPolarPointerAnnotation = "SVGPolarPointerAnnotation",
    /**
     * The Annotation is an {@link HtmlCustomAnnotation | HtmlCustomAnnotation}
     * @remarks
     * {@link HtmlCustomAnnotation | HtmlCustomAnnotation} are drawn on HTML layer of a surface add custom HTML content to it
     */
    HtmlCustomAnnotation = "HtmlCustomAnnotation",
    /**
     * The Annotation is an {@link HtmlTextAnnotation | HtmlTextAnnotation}
     * @remarks
     * {@link HtmlTextAnnotation | HtmlTextAnnotation} are drawn on HTML layer of a surface add custom HTML content to it
     */
    HtmlTextAnnotation = "HtmlTextAnnotation",
    /**
     * The Annotation is an {@link SvgLineAnnotation | SvgLineAnnotation}
     * @remarks
     * {@link SvgLineAnnotation | SvgLineAnnotation} are drawn using plain SVG only.
     */
    SvgLineAnnotation = "SvgLineAnnotation",
    /**
     * The Annotation is a {@link ICompositeAnnotation | CompositeAnnotation} which groups multiple annotations together
     */
    CompositeAnnotation = "CompositeAnnotation"
}
/**
 * Defines the interface to an Annotation - a type of marker, text label, line or custom UI overlay on a 2D Cartesian {@link SciChartSurface}
 */
export interface IAnnotation extends IDeletable, INotifyOnDpiChanged, IHoverable, IWithXYAxes, IOrderedRenderable {
    /**
     * A unique Id for the {@link IAnnotation}
     */
    readonly id: string;
    /**
     * @description annotation type. See {@link EAnnotationType} for a list of values
     */
    readonly type: EAnnotationType;
    /**
     * @description compatible surface types. See {@link EAnnotationType} for a list of values
     */
    readonly surfaceTypes: ESurfaceType[];
    /**
     * @description defines if the annotation is SVG annotation
     */
    readonly isSvgAnnotation: boolean;
    /**
     * @description defines if the annotation is rendered as HTMLElement or on WebGL Canvas via RenderContext
     * @readonly Check for other versions that are drawn with alternative approaches if needed
     */
    readonly isDomAnnotation: boolean;
    /**
     * Gets the bound {@link AxisBase2D | XAxis} for this {@link IAnnotation}.
     */
    readonly xAxis: AxisBase2D | undefined;
    /**
     * Gets the bound {@link AxisBase2D | YAxis} for this {@link IAnnotation}.
     */
    readonly yAxis: AxisBase2D | undefined;
    /**
     * @description The layer to place the annotation on. See {@link EAnnotationLayer} for a list of values
     * @remarks applicable only to WebGL annotations
     */
    annotationLayer: EAnnotationLayer;
    /**
     * The Id of the parent {@link CompositeAnnotation} of this annotation.
     * Returns `null` if there is no parent and the annotation is a top-level annotation.
     */
    parentAnnotationId: string | null;
    /**
     * @description callback which notifies the parent {@link SciChartSurface} it's time to draw
     */
    invalidateParentCallback: (options?: {
        force?: boolean;
        svgOnly?: boolean;
    }) => void;
    /**
     * @summary The current XAxis Id that this {@link IAnnotation} is bound to. If undefined it will use the first X axis attached to SciChartSurface
     * @description By default all Annotations will draw on the first X,Y axis pair in SciChart.
     * If you want this to change, you must add a second axis to your {@link SciChartSurface} and link the {@link IAnnotation} by Axis Id.
     *
     * For example:
     * ```ts
     * const sciChartSurface: SciChartSurface;
     * const primaryXAxis = new NumericAxis(wasmContext);
     * const primaryYAxis = new NumericAxis(wasmContext);
     *
     * const secondaryXAxis = new NumericAxis(wasmContext); // For subsequent X,Y axis set an Id
     * secondaryXAxis.id = "SecondaryXAxis";
     * const secondaryYAxis = new NumericAxis(wasmContext);
     * secondaryYAxis.id = "SecondaryYAxis";
     *
     * // Add all Axis to the chart
     * sciChartSurface.xAxes.add(primaryXAxis);
     * sciChartSurface.yAxes.add(primaryYAxis);
     * sciChartSurface.xAxes.add(secondaryXAxis);
     * sciChartSurface.yAxes.add(secondaryYAxis);
     *
     * // Add an Annotation on the default axis
     * const annotation = new LineAnnotation(wasmContext);
     * sciChartSurface.renderableSeries.add(annotation);
     *
     * // Add an Annotation on the specific axis
     * const annotation2 = new LineAnnotation(wasmContext);
     * annotation2.xAxisId = "SecondaryXAxis";
     * annotation2.yAxisId = "SecondaryYAxis";
     * sciChartSurface.renderableSeries.add(annotation2);
     * ```
     */
    xAxisId: string | undefined;
    /**
     * @summary The current YAxis Id that this {@link IAnnotation} is bound to. If undefined it will use the first X axis attached to SciChartSurface
     * @description By default all Annotations will draw on the first X,Y axis pair in SciChart.
     * If you want this to change, you must add a second axis to your {@link SciChartSurface} and link the {@link IAnnotation} by Axis Id.
     *
     * For example:
     * ```ts
     * const sciChartSurface: SciChartSurface;
     * const primaryXAxis = new NumericAxis(wasmContext);
     * const primaryYAxis = new NumericAxis(wasmContext);
     *
     * const secondaryXAxis = new NumericAxis(wasmContext); // For subsequent X,Y axis set an Id
     * secondaryXAxis.id = "SecondaryXAxis";
     * const secondaryYAxis = new NumericAxis(wasmContext);
     * secondaryYAxis.id = "SecondaryYAxis";
     *
     * // Add all Axis to the chart
     * sciChartSurface.xAxes.add(primaryXAxis);
     * sciChartSurface.yAxes.add(primaryYAxis);
     * sciChartSurface.xAxes.add(secondaryXAxis);
     * sciChartSurface.yAxes.add(secondaryYAxis);
     *
     * // Add an Annotation on the default axis
     * const annotation = new LineAnnotation(wasmContext);
     * sciChartSurface.renderableSeries.add(annotation);
     *
     * // Add an Annotation on the specific axis
     * const annotation2 = new LineAnnotation(wasmContext);
     * annotation2.xAxisId = "SecondaryXAxis";
     * annotation2.yAxisId = "SecondaryYAxis";
     * sciChartSurface.renderableSeries.add(annotation2);
     * ```
     */
    yAxisId: string | undefined;
    /**
     * @description the X1 coordinate of the annotation
     * @remarks The X1 coordinate obeys {@link xCoordinateMode} which defines whether the X1 coordinate is a pixel, data-value or relative coordinate
     */
    x1: number;
    /**
     * @description the X2 coordinate of the annotation
     * @remarks The X1 coordinate obeys {@link xCoordinateMode} which defines whether the X2 coordinate is a pixel, data-value or relative coordinate
     */
    x2: number;
    /**
     * @description the Y1 coordinate of the annotation
     * @remarks The Y1 coordinate obeys {@link xCoordinateMode} which defines whether the Y1 coordinate is a pixel, data-value or relative coordinate
     */
    y1: number;
    /**
     * @description the Y2 coordinate of the annotation
     * @remarks The Y2 coordinate obeys {@link xCoordinateMode} which defines whether the Y2 coordinate is a pixel, data-value or relative coordinate
     */
    y2: number;
    /**
     * The X-Coordinate mode. See {@link ECoordinateMode} for a list of values
     * @remarks Want to display an annotation stretching across the entire width (or height) or the {@link SciChartSurface}?
     * The {@link ECoordinateMode} enum has options which allow for relative, absolute or pixel coordinates which define annotation
     * placement.
     */
    xCoordinateMode: ECoordinateMode;
    /**
     * The Y-Coordinate mode. See {@link ECoordinateMode} for a list of values
     * @remarks Want to display an annotation stretching across the entire width (or height) or the {@link SciChartSurface}?
     * The {@link ECoordinateMode} enum has options which allow for relative, absolute or pixel coordinates which define annotation
     * placement.
     */
    yCoordinateMode: ECoordinateMode;
    /**
     * @description if true, the annotation is editable (can be dragged and manipulated by the user)
     */
    isEditable: boolean;
    /**
     * @description if true, the annotation is hidden
     */
    isHidden: boolean;
    /**
     * @description the parent SciChartSurfaceBase for this annotation
     */
    parentSurface: SciChartSurfaceBase;
    /**
     * @description if true, the chart is vertical
     */
    isVerticalChart: boolean;
    /**
     * @description When true, the annotation is selected and resize adorners will be displayed
     */
    isSelected: boolean;
    /**
     * Sets an opacity override for the entire annotation, from 0..1
     */
    opacity: number;
    /**
     * The clipping mode of the annotation
     */
    clipping: string | EAnnotationClippingMode;
    /**
     * The clipping mode of the annotation adorners
     */
    adornerClipping: string | EAnnotationClippingMode;
    /**
     * @description Called when the annotation is attached to a parent SciChartSurface.
     */
    onAttach(scs: SciChartSurfaceBase): void;
    /**
     * @description Called when the annotation is detached from a parent SciChartSurface.
     */
    onDetach(): void;
    /**
     * Convert the object to a definition that can be serialized to JSON, or used directly with the builder api
     */
    toJSON(): any;
    /**
     * Checks if passed point on the canvas is inside annotation borders
     * @param x the X screen coordinate relative to canvas
     * @param y the Y screen coordinate relative to canvas
     */
    checkIsClickedOnAnnotation(x: number, y: number): boolean;
    /**
     * Resolves the current interaction cursor for this annotation.
     */
    resolveInteractionCursor(mousePoint?: Point): string | undefined;
    /** Used internally - Sets references to X and Y axes */
    linkAxes(): void;
}
