import type { ChartModel } from "../chart-model/chart-model.js";
import type { ModelParams } from "../interfaces/chart-interfaces.js";
import type { ModelTypes } from "../interfaces/common.js";
import type { WithAxisLabelsSymbol } from "../properties/axes/axis-labels-symbol.js";
import type { WithAxisLinesSymbol } from "../properties/axes/axis-lines-symbol.js";
import type { WithXBounds } from "../properties/axes/x-axis/x-bounds.js";
import type { WithXAxisLabelsVisibility } from "../properties/axes/x-axis/x-axis-labels-visibility.js";
import type { WithXAxisTitleSymbol } from "../properties/axes/x-axis/x-axis-title-symbol.js";
import type { WithXAxisTitleText } from "../properties/axes/x-axis/x-axis-title-text.js";
import type { WithXAxisTitleVisibility } from "../properties/axes/x-axis/x-axis-title-visibility.js";
import type { WithGenerateXAxisTitle } from "../properties/axes/x-axis/generate-x-axis-title.js";
import type { ValueConversion, WebChartTextSymbol } from "../../spec/web-chart.js";
import type { GaugeChartSubTypes, WebChartStatisticType } from "../../spec/chart-object-literals.js";
import type { ISimpleFillSymbol } from "../../spec/rest-js-types.js";
import type { ChartConfig } from "../../utils/types/index.js";
import type { ModelWithXGuides } from "../mixins/model-with-x-guides.js";

export class GaugeModel extends GaugeModelSuperclass {
  /**
   * Aggregation type used for the gauge.
   *
   * Must be one of the values allowed by `WebChartStatisticType`, excluding `"no_aggregation"`.
   */
  accessor aggregationType: WebChartStatisticType;
  /** Whether axis ticks are visible. */
  accessor axisTickVisibility: boolean;
  /** End angle of the gauge. */
  accessor endAngle: number;
  /**
   * Gets the index of the feature to be rendered.
   * - For statistic gauge, this property will be ignored.
   * - For feature based gauge, if this property is not present, the first feature will be used (`featureIndex = 0`).
   */
  get featureIndex(): number | undefined;
  set featureIndex(value: number | null | undefined);
  /** Data field used for the gauge. */
  accessor field: string;
  /**
   * Type of gauge
   * - `featureGauge` indicates that the gauge is based on a specific feature from the layer.
   * - `statisticGauge` indicates that the gauge is based on a statistic value calculated from the layer's features.
   *
   * **Note**: When this property is not specified, it will be defaulted to `statisticGauge`.
   */
  get gaugeSubType(): GaugeChartSubTypes;
  /**
   * Content symbol for the inner label.
   *
   * @example
   * ```typescript
   * gaugeModel.innerLabelContent = {
   *   type: "esriTS",
   *   text: "Inner label",
   * };
   * ```
   */
  accessor innerLabelContent: WebChartTextSymbol | undefined;
  /** Whether the inner label is visible. */
  accessor innerLabelVisible: boolean;
  /** Inner radius of the gauge. */
  accessor innerRadius: number;
  /** Labels increment for the gauge. */
  accessor labelsIncrement: number | undefined;
  /** Whether to display the pin for the gauge's needle. */
  accessor needleDisplayPin: boolean;
  /** End width of the gauge's needle. */
  accessor needleEndWidth: number | null | undefined;
  /** Inner radius of the gauge's needle. */
  accessor needleInnerRadius: number | null | undefined;
  /** Start width of the gauge's needle. */
  accessor needleStartWidth: number | null | undefined;
  /**
   * Symbol of the gauge's needle.
   *
   * @example
   * ```typescript
   * gaugeModel.needleSymbol = {
   *   type: "esriSFS",
   *   color: [255, 0, 0, 255],
   * };
   * ```
   */
  accessor needleSymbol: ISimpleFillSymbol | undefined;
  /** Visibility of the gauge's needle. */
  accessor needleVisibility: boolean;
  /** Whether to only show the first and last axis labels. */
  accessor onlyShowFirstAndLastLabels: boolean;
  /** Start angle of the gauge. */
  accessor startAngle: number;
  /** Conversion to apply to the gauge value. */
  accessor valueConversion: ValueConversion | undefined;
  /** Generate the proper chart title given the current config. */
  generateChartTitle(): string;
  /** Removes the existing feature index from the config object. */
  removeFeatureIndex(): void;
  /**
   * Completes the async setup process for the chart model. Must be called before using the model.
   *
   * @param params
   */
  setup(params: ModelParams<ChartConfig<typeof ModelTypes.Gauge>>): Promise<void>;
}
declare const GaugeModelSuperclass: typeof ChartModel & typeof ModelWithXGuides & typeof WithGenerateXAxisTitle & typeof WithAxisLinesSymbol & typeof WithAxisLabelsSymbol & typeof WithXAxisTitleSymbol & typeof WithXBounds & typeof WithXAxisTitleVisibility & typeof WithXAxisLabelsVisibility & typeof WithXAxisTitleText