import type { ModelTypes } from "../interfaces/common.js";
import type { ModelParams } from "../interfaces/chart-interfaces.js";
import type { ChartModel } from "../chart-model/chart-model.js";
import type { WithColorMatch } from "../properties/color-match.js";
import type { WithDataLabelsVisibility } from "../properties/data-labels/data-labels-visibility.js";
import type { WithDataLabelsSymbol } from "../properties/data-labels/data-labels-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 { WithAxisLabelsSymbol } from "../properties/axes/axis-labels-symbol.js";
import type { WithAxisLinesSymbol } from "../properties/axes/axis-lines-symbol.js";
import type { ChartConfig } from "../../utils/types/index.js";
import type { HistogramOverlays } from "../../spec/web-chart.js";
import type { WebChartDataTransformations } from "../../spec/chart-object-literals.js";
import type { ISimpleFillSymbol, ISimpleLineSymbol } from "../../spec/rest-js-types.js";
import type { ModelWithMultiAxes } from "../mixins/model-with-multi-axes.js";
import type { ModelWithLegend } from "../mixins/model-with-legend.js";
import type { ModelWithTooltips } from "../mixins/model-with-tooltips.js";
import type { ModelWithYGuides } from "../mixins/model-with-y-guides.js";

export class HistogramModel extends HistogramModelSuperclass {
  /** Number of bins used to create the histogram. */
  accessor binCount: number;
  /**
   * Fill symbol used for the bins in the histogram.
   *
   * @example
   * ```ts
   * histogramModel.binSymbol = {
   *  style: "esriSFSForwardDiagonal",
   *  color: [0, 255, 0, 100],
   * };
   * ```
   */
  accessor binSymbol: ISimpleFillSymbol;
  /**
   * Data transformation type used in the histogram.
   * `none`: No data transformation is applied to the histogram.
   * `logarithmic`: Data is transformed using logarithm function. It can only be
   * `squareRoot`: Data is transformed using square root function. It can only be applied to numbers greater than or equal to zero.
   */
  accessor dataTransformationType: WebChartDataTransformations;
  /** Line symbol used for the mean overlay in the histogram. */
  accessor meanSymbol: ISimpleLineSymbol;
  /** Line symbol used for the median overlay in the histogram. */
  accessor medianSymbol: ISimpleLineSymbol;
  /** Line symbol used for the normal distribution overlay in the histogram. */
  accessor normalDistSymbol: ISimpleLineSymbol;
  /** Numeric field used to create the histogram to visualize the frequency distribution of its values. */
  accessor numericField: string;
  /** Chart overlays for the histogram: **mean**, **median**, **standardDeviation** and **comparisonDistribution**. */
  accessor seriesOverlays: HistogramOverlays | undefined;
  /** Whether the mean overlay is shown in the histogram. */
  accessor showMeanOverlay: boolean;
  /** Whether the median overlay is shown in the histogram. */
  accessor showMedianOverlay: boolean;
  /** Whether the normal distribution overlay is shown in the histogram. */
  accessor showNormalDistOverlay: boolean;
  /** Whether the standard deviation overlay is shown in the histogram. */
  accessor showStandardDevOverlay: boolean;
  /** Line symbol used for the standard deviation overlay in the histogram. */
  accessor standardDevSymbol: ISimpleLineSymbol;
  /** Generate the proper chart title given the current config. */
  generateChartTitle(): string;
  /**
   * Completes the async setup process for the chart model. Must be called before using the model.
   *
   * @param params
   */
  setup(params: ModelParams<ChartConfig<typeof ModelTypes.Histogram>>): Promise<void>;
}
declare const HistogramModelSuperclass: typeof ChartModel & typeof WithGenerateXAxisTitle & typeof WithAxisLinesSymbol & typeof WithAxisLabelsSymbol & typeof WithXAxisTitleSymbol & typeof WithXBounds & typeof WithXAxisTitleVisibility & typeof WithXAxisLabelsVisibility & typeof WithXAxisTitleText & typeof ModelWithYGuides & typeof WithDataLabelsSymbol & typeof WithDataLabelsVisibility & typeof WithColorMatch & typeof ModelWithTooltips & typeof ModelWithLegend & typeof ModelWithMultiAxes