import type PointCloudRenderer from "./PointCloudRenderer.js";
import type RendererLegendOptions from "./support/RendererLegendOptions.js";
import type ColorClassBreakInfo from "./support/pointCloud/ColorClassBreakInfo.js";
import type { PointCloudRendererProperties } from "./PointCloudRenderer.js";
import type { FieldTransformType } from "./support/pointCloud/types.js";
import type { RendererLegendOptionsProperties } from "./support/RendererLegendOptions.js";
import type { ColorClassBreakInfoProperties } from "./support/pointCloud/ColorClassBreakInfo.js";

export interface PointCloudClassBreaksRendererProperties extends PointCloudRendererProperties, Partial<Pick<PointCloudClassBreaksRenderer, "field" | "fieldTransformType">> {
  /**
   * Each element in the array is an object that provides information about a class break
   * associated with the renderer. Each object has the following specification:
   */
  colorClassBreakInfos?: ColorClassBreakInfoProperties[] | null;
  /**
   * An object providing options for displaying the renderer in the Legend.
   *
   * @since 4.6
   * @example
   * renderer.legendOptions = {
   *   title: "Density",
   *   order: "descending-values",
   * };
   */
  legendOptions?: RendererLegendOptionsProperties | null;
}

/**
 * This class defines the color of each point in a [PointCloudLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/PointCloudLayer/)
 * based on the value of a numeric attribute. Colors are assigned based on classes or ranges
 * of data. Each point is assigned a symbol based on the class break in which the value
 * of the attribute falls.
 *
 * @since 4.2
 * @see [Sample - PointCloudLayer with renderer](https://developers.arcgis.com/javascript/latest/sample-code/layers-pointcloud/)
 * @see [ClassBreaksRenderer](https://developers.arcgis.com/javascript/latest/references/core/renderers/ClassBreaksRenderer/)
 */
export default class PointCloudClassBreaksRenderer extends PointCloudRenderer {
  constructor(properties?: PointCloudClassBreaksRendererProperties);
  /**
   * Each element in the array is an object that provides information about a class break
   * associated with the renderer. Each object has the following specification:
   */
  get colorClassBreakInfos(): ColorClassBreakInfo[] | null | undefined;
  set colorClassBreakInfos(value: ColorClassBreakInfoProperties[] | null | undefined);
  /**
   * The name of the field that is used to drive the color visualization for the renderer.
   * The value of this field determines which class break each point is assigned.
   */
  accessor field: string | null | undefined;
  /** A transform that is applied to the field value before evaluating the renderer. */
  accessor fieldTransformType: FieldTransformType | null | undefined;
  /**
   * An object providing options for displaying the renderer in the Legend.
   *
   * @since 4.6
   * @example
   * renderer.legendOptions = {
   *   title: "Density",
   *   order: "descending-values",
   * };
   */
  get legendOptions(): RendererLegendOptions | null | undefined;
  set legendOptions(value: RendererLegendOptionsProperties | null | undefined);
  /** The type of renderer. */
  get type(): "point-cloud-class-breaks";
  /**
   * Creates a deep clone of the renderer.
   *
   * @returns A deep clone
   * of the object that invoked this method.
   * @example
   * // Creates a deep clone of the first layer's renderer
   * let renderer = view.map.layers.at(0).renderer.clone();
   */
  clone(): PointCloudClassBreaksRenderer;
}