import type { ChartModel } from "../chart-model/chart-model.js";
import type { CategoryFormatOptions, DateTimeFormatOptions, NumberFormatOptions, WebChartAxisScrollBar, WebChartCursorCrosshair, WebChartTextSymbol } from "../../spec/web-chart.js";
import type { WebChartLabelBehavior } from "../../spec/chart-object-literals.js";
import type { ISimpleLineSymbol } from "../../spec/rest-js-types.js";

export abstract class ModelWithMultiAxes extends ChartModel {
  /**
   * Cursor crosshair from the chart config.
   *
   * **Note:** To set the cursor crosshair for the second Y-axis (axisIndex 2), ensure there is a second Y-axis in the chart by using the `setAssignToSecondValueAxis(true, 1)` method to assign a series to the second Y-axis.
   */
  accessor cursorCrosshair: WebChartCursorCrosshair | undefined;
  /**
   * Visibility of the horizontal line of the cursor's crosshair.
   * - If the cursor crosshair or its horizontal line visibility is not set, the default value of `false` will be returned.
   *
   * **Note:** To set the cursor crosshair horizontal line visibility for the second Y-axis (axisIndex 2), ensure there is a second Y-axis in the chart by using the `setAssignToSecondValueAxis(true, 1)` method to assign a series to the second Y-axis.
   */
  accessor cursorCrosshairHorizontalLineVisibility: boolean;
  /**
   * Style of the cursor's crosshair from the chart config.
   *
   * **Note:** To set the cursor crosshair style for the second Y-axis (axisIndex 2), ensure there is a second Y-axis in the chart by using the `setAssignToSecondValueAxis(true, 1)` method to assign a series to the second Y-axis.
   */
  accessor cursorCrosshairStyle: ISimpleLineSymbol | undefined;
  /**
   * Visibility of the vertical line of the cursor's crosshair.
   * - If the cursor crosshair or its vertical line visibility is not set, the default value of `false` will be returned.
   *
   * **Note:** To set the cursor crosshair vertical line visibility for the second Y-axis (axisIndex 2), ensure there is a second Y-axis in the chart by using the `setAssignToSecondValueAxis(true, 1)` method to assign a series to the second Y-axis.
   */
  accessor cursorCrosshairVerticalLineVisibility: boolean;
  /** Generate the proper y-axis title from the current config. */
  abstract generateYAxisTitle(): string;
  /**
   * Gets the visibility of the specified axis labels.
   *
   * @param axisIndex - axisIndex The index of the axis (0 for X-axis, 1 for Y-axis, 2 for second Y-axis).
   * @returns {boolean}
   */
  getAxisLabelsVisibility(axisIndex: number): boolean;
  /**
   * Gets the scrollbar configuration for the specified axis.
   *
   * @param axisIndex - The index of the axis (0 for X-axis, 1 for Y-axis, 2 for second Y-axis).
   */
  getAxisScrollbar(axisIndex: number): WebChartAxisScrollBar | undefined;
  /**
   * Gets the specified title text symbol. Contains styling information such as font, color, and symbol style.
   *
   * @param axisIndex - The index of the axis to get the title symbol for
   */
  getAxisTitleSymbol(axisIndex: number): WebChartTextSymbol | undefined;
  /**
   * Gets the title text of the specified axis.
   *
   * @param axisIndex - The index of the axis (0 for X-axis, 1 for Y-axis, 2 for second Y-axis).
   */
  getAxisTitleText(axisIndex: number): string;
  /**
   * Gets the visibility of the specified axis title.
   *
   * @param axisIndex - The index of the axis (0 for X-axis, 1 for Y-axis, 2 for second Y-axis).
   */
  getAxisTitleVisibility(axisIndex: number): boolean;
  /**
   * Gets the value format for the specified axis.
   *
   * @param axisIndex - The index of the axis (0 for X-axis, 1 for Y-axis, 2 for second Y-axis).
   */
  getAxisValueFormat(axisIndex: number): CategoryFormatOptions | DateTimeFormatOptions | NumberFormatOptions | undefined;
  /**
   * Gets the visibility of the specified axis.
   *
   * @param axisIndex - axisIndex The index of the axis (0 for X-axis, 1 for Y-axis, 2 for second Y-axis).
   * @returns {boolean}
   */
  getAxisVisibility(axisIndex: number): boolean;
  /**
   * Gets the buffer setting for the specified axis.
   * - This setting is only applicable to the axis of type ValueAxis.
   * - To get the setting for the x-axis, the axisIndex should be `0`. For the y-axis, the axisIndex should be `1`.
   * - If the `buffer` is not set on the axis, the default value of `false` will be returned.
   *
   * @param axisIndex - The index of the axis
   */
  getBuffer(axisIndex: number): boolean;
  /** Get the default x-axis title text. */
  getDefaultXAxisTitleText(): string;
  /**
   * Gets the display cursor tooltip setting for the specified axis.
   * - To get the setting for the x-axis, the axisIndex should be `0`. For the y-axis, the axisIndex should be `1`.
   * - If the displayCursorTooltip is not set on the axis, the default value of `false` will be returned.
   *
   * @param axisIndex - The index of the axis to get the display cursor tooltip for.
   */
  getDisplayCursorTooltip(axisIndex: number): boolean;
  /**
   * Gets the display zero line setting for the specified axis.
   * - This setting is only applicable to the axis of type ValueAxis.
   * - To get the setting for the x-axis, the axisIndex should be `0`. For the y-axis, the axisIndex should be `1`.
   * - If the displayZeroLine is not set on the axis, the default value of `false` will be returned.
   *
   * @param axisIndex - The index of the axis to get the display zero line for.
   */
  getDisplayZeroLine(axisIndex: number): boolean;
  /** Gets the grid lines symbol. Contains styling information such as line width, line style, and line color. */
  getGridLinesSymbol(): ISimpleLineSymbol | undefined;
  /** Gets the horizontal axis labels behavior for the chart. */
  getHorizontalAxisLabelsBehavior(): WebChartLabelBehavior;
  /**
   * Gets the integer only values setting for the specified axis.
   * - This setting is only applicable to the axis of type ValueAxis.
   * - To get the setting for the x-axis, the axisIndex should be `0`. For the y-axis, the axisIndex should be `1`.
   * - If the `integerOnlyValues` is not set on the axis, the default value of `false` will be returned.
   *
   * @param axisIndex - The index of the axis
   */
  getIntegerOnlyValues(axisIndex: number): boolean;
  /**
   * Gets whether logarithmic scale is enabled for the specified axis.
   * - `true`: Logarithmic scale is enabled for the specified axis.
   * - `false`: Logarithmic scale is disabled for the specified axis.
   *
   * @param axisIndex - The index of the axis (0 for X-axis, 1 for Y-axis, 2 for second Y-axis).
   */
  getLogarithmic(axisIndex: number): boolean;
  /**
   * Gets the maximum bound for the specified axis.
   *
   * @param axisIndex - The index of the axis (0 for X-axis, 1 for Y-axis, 2 for second Y-axis).
   */
  getMaxBound(axisIndex: number): number;
  /**
   * Gets the minimum bound for the specified axis.
   *
   * @param axisIndex - The index of the axis (0 for X-axis, 1 for Y-axis, 2 for second Y-axis).
   */
  getMinBound(axisIndex: number): number;
  /**
   * Gets the tick spacing setting for the specified axis.
   * - To get the setting for the x-axis, the axisIndex should be `0`. For the y-axis, the axisIndex should be `1`.
   *
   * @param axisIndex - The index of the axis
   */
  getTickSpacing(axisIndex: number): number | undefined;
  /** Gets the vertical axis labels behavior for the chart. */
  getVerticalAxisLabelsBehavior(): WebChartLabelBehavior;
  /**
   * Sets the visibility of the specified axis labels.
   * **Note:** The labels visibility for the second Y-axis (axisIndex 2) will only be applied if there is a second Y-axis in the chart. To enable the second Y-axis, use the `setAssignToSecondValueAxis(true, 1)` method to assign a series to the second Y-axis.
   *
   * @param isVisible - isVisible The visibility state for the axis labels.
   * @param axisIndex - axisIndex The index of the axis (0 for X-axis, 1 for Y-axis, 2 for second Y-axis).
   */
  setAxisLabelsVisibility(isVisible: boolean, axisIndex: number): void;
  /**
   * Sets the scrollbar configuration for the specified axis.
   * **Note:** The scrollbar configuration for the second Y-axis (axisIndex 2) will only be applied if there is a second Y-axis in the chart. To enable the second Y-axis, use the `setAssignToSecondValueAxis(true, 1)` method to assign a series to the second Y-axis.
   *
   * @param scrollbar - The scrollbar configuration to set.
   * @param axisIndex - The index of the axis (0 for X-axis, 1 for Y-axis, 2 for second Y-axis).
   */
  setAxisScrollbar(scrollbar: WebChartAxisScrollBar, axisIndex: number): void;
  /**
   * Sets the title text symbol for the specified axis. Contains styling information such as font, color, and symbol style.
   * **Note:** The title text symbol for the second Y-axis (axisIndex 2) will only be applied if there is a second Y-axis in the chart. To enable the second Y-axis, use the `setAssignToSecondValueAxis(true, 1)` method to assign a series to the second Y-axis.
   *
   * @param titleSymbol - The title text symbol to set.
   * @param axisIndex - The index of the axis (0 for X-axis, 1 for Y-axis, 2 for second Y-axis).
   */
  setAxisTitleSymbol(titleSymbol: WebChartTextSymbol | undefined, axisIndex: number): void;
  /**
   * Sets the title text for the specified axis.
   * **Note:** The title text for the second Y-axis (axisIndex 2) will only be applied if there is a second Y-axis in the chart. To enable the second Y-axis, use the `setAssignToSecondValueAxis(true, 1)` method to assign a series to the second Y-axis.
   *
   * @param titleText - The title text for the axis.
   * @param axisIndex - The index of the axis (0 for X-axis, 1 for Y-axis, 2 for second Y-axis).
   */
  setAxisTitleText(titleText: string, axisIndex: number): void;
  /**
   * Sets the visibility of the specified axis title.
   * **Note:** The title visibility for the second Y-axis (axisIndex 2) will only be applied if there is a second Y-axis in the chart. To enable the second Y-axis, use the `setAssignToSecondValueAxis(true, 1)` method to assign a series to the second Y-axis.
   *
   * @param isVisible - The visibility state for the axis title.
   * @param axisIndex - The index of the axis (0 for X-axis, 1 for Y-axis, 2 for second Y-axis).
   */
  setAxisTitleVisibility(isVisible: boolean, axisIndex: number): void;
  /**
   * Sets the value format for the specified axis.
   * **Note:** The value format for the second Y-axis (axisIndex 2) will only be applied if there is a second Y-axis in the chart. To enable the second Y-axis, use the `setAssignToSecondValueAxis(true, 1)` method to assign a series to the second Y-axis.
   *
   * @param axisIndex - The index of the axis (0 for X-axis, 1 for Y-axis, 2 for second Y-axis).
   * @param valueFormat - The value format to set.
   */
  setAxisValueFormat(axisIndex: number, valueFormat?: CategoryFormatOptions | DateTimeFormatOptions | NumberFormatOptions): void;
  /**
   * Sets the visibility of the specified axis.
   * **Note:** The visibility for the second Y-axis (axisIndex 2) will only be applied if there is a second Y-axis in the chart. To enable the second Y-axis, use the `setAssignToSecondValueAxis(true, 1)` method to assign a series to the second Y-axis.
   *
   * @param isVisible - isVisible The visibility state for the axis.
   * @param axisIndex - axisIndex The index of the axis (0 for X-axis, 1 for Y-axis, 2 for second Y-axis).
   */
  setAxisVisibility(isVisible: boolean, axisIndex: number): void;
  /**
   * Sets the buffer for the specified axis.
   * - This setting is only applicable to the axis of type ValueAxis.
   * - To set the setting for the x-axis, the axisIndex should be `0`. For the y-axis, the axisIndex should be `1`.
   *
   * **Note:** To set the buffer for the second Y-axis (axisIndex 2), ensure there is a second Y-axis in the chart by using the `setAssignToSecondValueAxis(true, 1)` method to assign a series to the second Y-axis.
   *
   * @param buffer - The setting for the buffer
   * @param axisIndex - The index of the axis
   */
  setBuffer(buffer: boolean, axisIndex: number): void;
  /**
   * Sets the display cursor tooltip setting for the specified axis.
   * - To set the setting for the x-axis, the axisIndex should be `0`. For the y-axis, the axisIndex should be `1`.
   *
   * **Note:** To set the display cursor tooltip for the second Y-axis (axisIndex 2), ensure there is a second Y-axis in the chart by using the `setAssignToSecondValueAxis(true, 1)` method to assign a series to the second Y-axis.
   *
   * @param displayCursorTooltip - The display cursor tooltip setting for the axis.
   * @param axisIndex - The index of the axis to set the display cursor tooltip for.
   */
  setDisplayCursorTooltip(displayCursorTooltip: boolean, axisIndex: number): void;
  /**
   * Sets the display zero line setting for the specified axis.
   *
   * - This setting is only applicable to the axis of type ValueAxis.
   * - To set the setting for the x-axis, the axisIndex should be `0`. For the y-axis, the axisIndex should be `1`.
   *
   * **Note:** To set the display zero line for the second Y-axis (axisIndex 2), ensure there is a second Y-axis in the chart by using the `setAssignToSecondValueAxis(true, 1)` method to assign a series to the second Y-axis.
   *
   * @param displayZeroLine - The display zero line setting for the axis.
   * @param axisIndex - The index of the axis to set the display zero line for.
   */
  setDisplayZeroLine(displayZeroLine: boolean, axisIndex: number): void;
  /**
   * Sets the grid lines symbol. Contains styling information such as line width, line style, and line color.
   * **Note:** To set the grid lines symbol for the second Y-axis (axisIndex 2), ensure there is a second Y-axis in the chart by using the `setAssignToSecondValueAxis(true, 1)` method to assign a series to the second Y-axis.
   *
   * @param linesSymbol - The grid lines symbol.
   * @param axisIndices - The indices of the axes to set the grid lines symbol for.
   */
  setGridLinesSymbol(linesSymbol: ISimpleLineSymbol | undefined, axisIndices?: number[]): void;
  /**
   * Sets the horizontal axis labels behavior for the chart.
   * **Note:** The horizontal axis labels behavior for the second Y-axis (axisIndex 2) will only be applied if there is a second Y-axis in the chart. To enable the second Y-axis, use the `setAssignToSecondValueAxis(true, 1)` method to assign a series to the second Y-axis.
   *
   * @param horizontalBehavior - The behavior for the horizontal axis labels.
   */
  setHorizontalAxisLabelsBehavior(horizontalBehavior: WebChartLabelBehavior): void;
  /**
   * Sets the integer only values setting for the specified axis.
   * - This setting is only applicable to the axis of type ValueAxis.
   * - To set the setting for the x-axis, the axisIndex should be `0`. For the y-axis, the axisIndex should be `1`.
   *
   * **Note:** To set the integer only values for the second Y-axis (axisIndex 2), ensure there is a second Y-axis in the chart by using the `setAssignToSecondValueAxis(true, 1)` method to assign a series to the second Y-axis.
   *
   * @param integerOnlyValues - The boolean value to set for the integer only values setting
   * @param axisIndex - The index of the axis
   */
  setIntegerOnlyValues(integerOnlyValues: boolean, axisIndex: number): void;
  /**
   * Sets whether logarithmic scale is enabled for the specified axis.
   * - `true`: Enable logarithmic scale for the specified axis.
   * - `false`: Disable logarithmic scale for the specified axis.
   *
   * **Note:** The logarithmic scale for the second Y-axis (axisIndex 2) will only be applied if there is a second Y-axis in the chart. To enable the second Y-axis, use the `setAssignToSecondValueAxis(true, 1)` method to assign a series to the second Y-axis.
   *
   * @param isLogarithmic - Whether to enable logarithmic scale for the specified axis.
   * @param axisIndex - The index of the axis (0 for X-axis, 1 for Y-axis, 2 for second Y-axis).
   */
  setLogarithmic(isLogarithmic: boolean, axisIndex: number): void;
  /**
   * Sets the maximum bound for the specified axis.
   * **Note:** The maximum bound for the second Y-axis (axisIndex 2) will only be applied if there is a second Y-axis in the chart. To enable the second Y-axis, use the `setAssignToSecondValueAxis(true, 1)` method to assign a series to the second Y-axis.
   *
   * @param newMaxBound - The value to set as the maximum bound.
   * @param axisIndex - The index of the axis (0 for X-axis, 1 for Y-axis, 2 for second Y-axis).
   */
  setMaxBound(newMaxBound: number | null, axisIndex: number): void;
  /**
   * Sets the minimum bound for the specified axis.
   * **Note:** The minimum bound for the second Y-axis (axisIndex 2) will only be applied if there is a second Y-axis in the chart. To enable the second Y-axis, use the `setAssignToSecondValueAxis(true, 1)` method to assign a series to the second Y-axis.
   *
   * @param newMinBound - The value to set as the minimum bound.
   * @param axisIndex - The index of the axis (0 for X-axis, 1 for Y-axis, 2 for second Y-axis).
   */
  setMinBound(newMinBound: number | null, axisIndex: number): void;
  /**
   * Sets the tick spacing for the specified axis.
   * - To set the setting for the x-axis, the axisIndex should be `0`. For the y-axis, the axisIndex should be `1`.
   * **Note:** To set the tick spacing for the second Y-axis (axisIndex 2), ensure there is a second Y-axis in the chart by using the `setAssignToSecondValueAxis(true, 1)` method to assign a series to the second Y-axis.
   *
   * @param tickSpacing - The value to set for the tick spacing
   * @param axisIndex - The index of the axis
   */
  setTickSpacing(tickSpacing: number, axisIndex: number): void;
  /**
   * Sets the vertical axis labels behavior for the chart.
   * **Note:** The vertical axis labels behavior for the second Y-axis (axisIndex 2) will only be applied if there is a second Y-axis in the chart. To enable the second Y-axis, use the `setAssignToSecondValueAxis(true, 1)` method to assign a series to the second Y-axis.
   *
   * @param verticalBehavior - The behavior for the vertical axis labels.
   */
  setVerticalAxisLabelsBehavior(verticalBehavior: WebChartLabelBehavior): void;
}