import type { JSONSupport } from "../../core/JSONSupport.js";
import type { SymbolUnion } from "../../symbols/types.js";
import type { WebStyleSymbolProperties } from "../../symbols/WebStyleSymbol.js";
import type { PolygonSymbol3DProperties } from "../../symbols/PolygonSymbol3D.js";
import type { PointSymbol3DProperties } from "../../symbols/PointSymbol3D.js";
import type { MeshSymbol3DProperties } from "../../symbols/MeshSymbol3D.js";
import type { LineSymbol3DProperties } from "../../symbols/LineSymbol3D.js";
import type { LabelSymbol3DProperties } from "../../symbols/LabelSymbol3D.js";
import type { CIMSymbolProperties } from "../../symbols/CIMSymbol.js";
import type { TextSymbolProperties } from "../../symbols/TextSymbol.js";
import type { SimpleMarkerSymbolProperties } from "../../symbols/SimpleMarkerSymbol.js";
import type { SimpleLineSymbolProperties } from "../../symbols/SimpleLineSymbol.js";
import type { SimpleFillSymbolProperties } from "../../symbols/SimpleFillSymbol.js";
import type { PictureMarkerSymbolProperties } from "../../symbols/PictureMarkerSymbol.js";
import type { PictureFillSymbolProperties } from "../../symbols/PictureFillSymbol.js";

export interface ClassBreakInfoProperties extends Partial<Pick<ClassBreakInfo, "label" | "maxValue" | "minValue">> {
  /**
   * Defines the symbol used to render features with data values that are within the bounds
   * defined for the class break. This value may be autocast by specifying the symbol `type`.
   *
   * @see [Guide - Esri color ramps](https://developers.arcgis.com/javascript/latest/esri-color-ramps/)
   * @see [Guide - Visualization best practices](https://developers.arcgis.com/javascript/latest/visualization-best-practices/)
   */
  symbol?: (((PictureFillSymbolProperties & { type: "picture-fill" }) | (PictureMarkerSymbolProperties & { type: "picture-marker" }) | (SimpleFillSymbolProperties & { type: "simple-fill" }) | (SimpleLineSymbolProperties & { type: "simple-line" }) | (SimpleMarkerSymbolProperties & { type: "simple-marker" }) | (TextSymbolProperties & { type: "text" }) | (CIMSymbolProperties & { type: "cim" })) | ((LabelSymbol3DProperties & { type: "label-3d" }) | (LineSymbol3DProperties & { type: "line-3d" }) | (MeshSymbol3DProperties & { type: "mesh-3d" }) | (PointSymbol3DProperties & { type: "point-3d" }) | (PolygonSymbol3DProperties & { type: "polygon-3d" })) | (WebStyleSymbolProperties & { type: "web-style" }));
}

/**
 * Defines a class break for a [ClassBreaksRenderer](https://developers.arcgis.com/javascript/latest/references/core/renderers/ClassBreaksRenderer/). A class break
 * defines a symbol for a range of numeric values. The [ClassBreaksRenderer](https://developers.arcgis.com/javascript/latest/references/core/renderers/ClassBreaksRenderer/)
 * determines the field or expression from which to request data used to drive the rendering. Each
 * feature's value is then used to assign the feature a symbol based on the break (or range) in which
 * the value falls.
 *
 * @since 4.0
 * @see [ClassBreaksRenderer](https://developers.arcgis.com/javascript/latest/references/core/renderers/ClassBreaksRenderer/)
 * @see [Guide - Esri color ramps](https://developers.arcgis.com/javascript/latest/esri-color-ramps/)
 * @see [Guide - Visualization best practices](https://developers.arcgis.com/javascript/latest/visualization-best-practices/)
 */
export default class ClassBreakInfo extends JSONSupport {
  constructor(properties?: ClassBreakInfoProperties);
  /**
   * Describes the data represented by the class break. This label will appear in the
   * [Legend](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-legend/) next to the symbol representing the break.
   * If no label is provided, then a default label is derived using the
   * [minValue](https://developers.arcgis.com/javascript/latest/references/core/renderers/support/ClassBreakInfo/#minValue) and [maxValue](https://developers.arcgis.com/javascript/latest/references/core/renderers/support/ClassBreakInfo/#maxValue).
   */
  accessor label: string | null | undefined;
  /**
   * Sets the maximum value for the class break. Features with this value or smaller as small as
   * the provided [minValue](https://developers.arcgis.com/javascript/latest/references/core/renderers/support/ClassBreakInfo/#minValue) will be rendered with the given [symbol](https://developers.arcgis.com/javascript/latest/references/core/renderers/support/ClassBreakInfo/#symbol).
   *
   * @default 0
   */
  accessor maxValue: number;
  /**
   * Sets the minimum value for the class break. Features with this value or greater up to
   * the provided [maxValue](https://developers.arcgis.com/javascript/latest/references/core/renderers/support/ClassBreakInfo/#maxValue) will be rendered with the given [symbol](https://developers.arcgis.com/javascript/latest/references/core/renderers/support/ClassBreakInfo/#symbol).
   */
  accessor minValue: number;
  /**
   * Defines the symbol used to render features with data values that are within the bounds
   * defined for the class break. This value may be autocast by specifying the symbol `type`.
   *
   * @see [Guide - Esri color ramps](https://developers.arcgis.com/javascript/latest/esri-color-ramps/)
   * @see [Guide - Visualization best practices](https://developers.arcgis.com/javascript/latest/visualization-best-practices/)
   */
  get symbol(): SymbolUnion;
  set symbol(value: (((PictureFillSymbolProperties & { type: "picture-fill" }) | (PictureMarkerSymbolProperties & { type: "picture-marker" }) | (SimpleFillSymbolProperties & { type: "simple-fill" }) | (SimpleLineSymbolProperties & { type: "simple-line" }) | (SimpleMarkerSymbolProperties & { type: "simple-marker" }) | (TextSymbolProperties & { type: "text" }) | (CIMSymbolProperties & { type: "cim" })) | ((LabelSymbol3DProperties & { type: "label-3d" }) | (LineSymbol3DProperties & { type: "line-3d" }) | (MeshSymbol3DProperties & { type: "mesh-3d" }) | (PointSymbol3DProperties & { type: "point-3d" }) | (PolygonSymbol3DProperties & { type: "polygon-3d" })) | (WebStyleSymbolProperties & { type: "web-style" })));
  /**
   * Creates a deep clone of the class break info object.
   *
   * @returns A deep clone of the class break
   *   that invoked this method.
   * @example
   * // Creates a deep clone of the first class break in the renderer
   * let firstClassBreak = renderer.classBreaks[0].clone();
   */
  clone(): ClassBreakInfo;
}