/*
 * Copyright (C) 2019 - 2025 Devexperts Solutions IE Limited
 * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
 * If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
 */
import { YExtentComponent } from '../components/pane/extent/y-extent-component';
import { DataSeriesYAxisLabelsProvider } from '../components/y_axis/price_labels/data-series-y-axis-labels.provider';
import { AtLeastOne } from '../utils/object.utils';
import { ChartBaseElement } from './chart-base-element';
import { DataSeriesView } from './data-series-view';
import { DataSeriesConfig, DataSeriesPaintConfig, DataSeriesType } from './data-series.config';
import { HighLowWithIndex, ScaleModel } from './scale.model';
import { HighLowProvider } from './scaling/auto-scale.model';
import { Index, Pixel, Unit, Viewable } from './scaling/viewport.model';
/**
 * Properties are named in order to match VisualCandle interface
 */
export declare class VisualSeriesPoint {
    centerUnit: Unit;
    close: Unit;
    constructor(centerUnit: Unit, close: Unit);
    /**
     * returns y coordinate in pixels
     */
    y(viewable: Viewable): Pixel;
    /**
     * returns x coordinate in pixels
     */
    x(viewable: Viewable): Pixel;
    clone(): VisualSeriesPoint;
}
export interface DataSeriesPoint {
    timestamp: number;
    close: Unit;
}
export interface DataSeriesViewportIndexes {
    dataIdxStart: Index;
    dataIdxEnd: Index;
}
/**
 * DataSeriesModel represents single time series chart.
 * Usually data source is presented as a one-dimension array, but here it can be presented as two-dimension array
 * If the data is presented as two-dim array when every data array will be drawn as a separate time-series
 * For example, linear chart type will be drawn with gaps on the chart
 */
export declare class DataSeriesModel<D extends DataSeriesPoint = DataSeriesPoint, V extends VisualSeriesPoint = VisualSeriesPoint> extends ChartBaseElement {
    extentComponent: YExtentComponent;
    id: string;
    htId: number;
    parentId?: string | number | undefined;
    name: string;
    highlighted: boolean;
    yAxisLabelProvider: DataSeriesYAxisLabelsProvider;
    readonly config: DataSeriesConfig;
    scale: ScaleModel;
    view: DataSeriesView;
    protected _dataPoints: D[][];
    pricePrecisions: number[];
    /**
     * Should be used for paint tools like rectangular drawing or diff cloud
     */
    linkedDataSeriesModels: DataSeriesModel<D, V>[];
    highLowProvider: HighLowProvider;
    get dataPoints2D(): D[][];
    get dataPoints(): D[];
    protected _dataPointsFlat: D[];
    set dataPoints(points: D[][] | D[]);
    protected _visualPoints: V[][];
    protected _visualPointsFlat: V[];
    dataIdxStart: Index;
    dataIdxEnd: Index;
    get visualPoints(): V[];
    get visualPoints2D(): V[][];
    set visualPoints(points: V[][] | V[]);
    constructor(extentComponent: YExtentComponent, id: string, htId: number, parentId?: string | number | undefined, _config?: AtLeastOne<DataSeriesConfig>);
    protected doActivate(): void;
    /**
     * Sets the data points and recalculates internal state
     * @param {DataSeriesPoint[][] | DataSeriesPoint[]} points - The data points to set for the model. Can be an array of arrays or a single array.
     * @returns {void}
     */
    setDataPoints(points: D[][] | D[]): void;
    /**
     * Returns the paint configuration object for a specific series part, or the default paint configuration object
     * if the specified series part is not defined in the current DataSeriesView configuration.
     *
     * @param {number} seriesPart - The index of the series part to get the paint configuration for.
     * @returns {DataSeriesPaintConfig} The paint configuration object for the specified series part, or the default paint configuration object.
     */
    getPaintConfig: (seriesPart: number) => DataSeriesPaintConfig;
    protected _toVisualPoints(data: D[][]): V[][];
    /**
     * Moves the DataSeriesModel to the given extent.
     * @param extent
     */
    moveToExtent(extent: YExtentComponent): void;
    /**
     * Transforms the given array of data points of type D into an array of visual points of type V.
     * Each visual point object contains a centerUnit property with the index of the point in the input array,
     * and a close property with the close value of the point.
     *
     * @param {D[]} data - The array of data points to transform into visual points.
     * @returns {V[]} An array of visual points, each with a centerUnit and close property.
     */
    toVisualPoints(data: D[]): V[];
    setType(type: DataSeriesType): void;
    /**
     * Recalculates the visual points of the DataSeriesView based on the current data points.
     * The visual points are stored in the visualPoints property of the DataSeriesView.
     * Should be called 1 time when data are set / updated to chart.
     */
    recalculateVisualPoints(): void;
    /**
     * Recalculates the indexes of the start and end points of the data viewport,
     * based on the current xStart and xEnd values of the scale model, or on the given xStart and xEnd parameters.
     *
     * @param {number} [xStart=this.scale.xStart] - The start value of the viewport on the x-axis. Defaults to the current xStart value of the scale model.
     * @param {number} [xEnd=this.scale.xEnd] - The end value of the viewport on the x-axis. Defaults to the current xEnd value of the scale model.
     */
    recalculateDataViewportIndexes(xStart?: number, xEnd?: number): void;
    /**
     * Calculates and returns the indexes of the start and end points of the data viewport,
     * based on the given start and end units on the x-axis.
     *
     * @param {Unit} xStart - The start value of the viewport on the x-axis.
     * @param {Unit} xEnd - The end value of the viewport on the x-axis.
     * @returns {DataSeriesViewportIndexes} An object containing the calculated start and end indexes of the data viewport.
     */
    calculateDataViewportIndexes(xStart: Unit, xEnd: Unit): DataSeriesViewportIndexes;
    /**
     * Formats the given numerical value using the default value formatter.
     *
     * @param {number} value - The numerical value to be formatted.
     * @returns {string} The formatted value as a string.
     */
    valueFormatter(value: number): string;
    /**
     * Returns the close value of the visual point at the given index, or 1 if the visual point is not defined.
     * The index defaults to the data index start of the DataSeriesView.
     *
     * @param {number} [idx=this.dataIdxStart] - The index of the visual point to retrieve the close value for.
     * @returns {Unit} The close value of the visual point at the given index, or 1 if the visual point is not defined.
     */
    getBaseline: (idx?: number) => Unit;
    /**
     * Returns the string representation of the close value of the given visual point.
     *
     * @param {VisualSeriesPoint} point - The visual point to get the string representation of the close value for.
     * @returns {string} The string representation of the close value of the given visual point.
     */
    getTextForPoint: (point: VisualSeriesPoint) => string;
    /**
     * Returns a two-dimensional array of the visual points in the viewport of the DataSeriesView.
     * The viewport range can be customized by providing start and end units on the x-axis.
     * If start or end units are not provided, the current viewport range of the DataSeriesView is used.
     *
     * @param {number} [xStart] - The start value of the viewport range on the x-axis.
     * @param {number} [xEnd] - The end value of the viewport range on the x-axis.
     * @returns {V[][]} A two-dimensional array of the visual points in the viewport of the DataSeriesView.
     */
    getSeriesInViewport(xStart?: number, xEnd?: number): V[][];
    /**
     * Returns last visible on the screen data series value
     * @param seriesIndex
     */
    getLastVisualSeriesPoint: () => V | undefined;
    /**
     * Return last overall data series value (even if not visible)
     * @param seriesIndex
     */
    getLastDataSeriesPoint: () => V | undefined;
}
export declare const calculateDataSeriesHighLow: (visualCandles: VisualSeriesPoint[]) => HighLowWithIndex;
export declare const defaultValueFormatter: (value: number) => string;
