import type ColorModulation from "./support/pointCloud/ColorModulation.js";
import type PointSizeFixedSizeAlgorithm from "./support/pointCloud/PointSizeFixedSizeAlgorithm.js";
import type PointSizeSplatAlgorithm from "./support/pointCloud/PointSizeSplatAlgorithm.js";
import type { JSONSupport } from "../core/JSONSupport.js";
import type { PointCloudRendererType } from "./support/pointCloud/types.js";
import type { PointSizeSplatAlgorithmProperties } from "./support/pointCloud/PointSizeSplatAlgorithm.js";
import type { PointSizeFixedSizeAlgorithmProperties } from "./support/pointCloud/PointSizeFixedSizeAlgorithm.js";
import type { ColorModulationProperties } from "./support/pointCloud/ColorModulation.js";

export interface PointCloudRendererProperties extends Partial<Pick<PointCloudRenderer, "pointsPerInch">> {
  /**
   * Reduces the brightness of the point's color, based on the value of another field, usually `intensity`.
   * High values leave the color unchanged, while low values darken the color of the point. This helps to
   * display the scanned surface in a more realistic way.
   *
   * @since 4.4
   * @see [Sample: PointCloudLayer - intensity color modulation](https://developers.arcgis.com/javascript/latest/sample-code/layers-pointcloud-color-modulation/)
   */
  colorModulation?: ColorModulationProperties;
  /**
   * Specifies how the size of the points in the point cloud is computed for
   * rendering.
   *
   * The splat algorithm automatically computes a size based on the density,
   * which varies with the Level of Detail that is currently displayed.
   *
   * The fixed size algorithm displays all points with the same size, either
   * in screen space or real world units.
   *
   * When `pointSizeAlgorithm` is not set, the default is `splat`.
   */
  pointSizeAlgorithm?: (PointSizeFixedSizeAlgorithmProperties & { type: "fixed-size" }) | (PointSizeSplatAlgorithmProperties & { type: "splat" });
}

/**
 * A PointCloudRenderer allows you to specify how points in a
 * [PointCloudLayer](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-PointCloudLayer.html) are rendered. Because
 * [PointCloudLayer](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-PointCloudLayer.html)s are designed to render millions of
 * points, the point cloud renderers are much simpler than other
 * [Renderer](https://developers.arcgis.com/javascript/latest/api-reference/esri-renderers-Renderer.html) classes.
 *
 * @since 4.2
 * @see [Sample - PointCloudLayer](https://developers.arcgis.com/javascript/latest/sample-code/layers-pointcloud-portal/)
 * @see [Sample - PointCloudLayer with renderer](https://developers.arcgis.com/javascript/latest/sample-code/layers-pointcloud/)
 */
export default class PointCloudRenderer extends JSONSupport {
  constructor(properties?: PointCloudRendererProperties);
  /**
   * Reduces the brightness of the point's color, based on the value of another field, usually `intensity`.
   * High values leave the color unchanged, while low values darken the color of the point. This helps to
   * display the scanned surface in a more realistic way.
   *
   * @since 4.4
   * @see [Sample: PointCloudLayer - intensity color modulation](https://developers.arcgis.com/javascript/latest/sample-code/layers-pointcloud-color-modulation/)
   */
  get colorModulation(): ColorModulation;
  set colorModulation(value: ColorModulationProperties);
  /**
   * Specifies how the size of the points in the point cloud is computed for
   * rendering.
   *
   * The splat algorithm automatically computes a size based on the density,
   * which varies with the Level of Detail that is currently displayed.
   *
   * The fixed size algorithm displays all points with the same size, either
   * in screen space or real world units.
   *
   * When `pointSizeAlgorithm` is not set, the default is `splat`.
   */
  get pointSizeAlgorithm(): PointSizeFixedSizeAlgorithm | PointSizeSplatAlgorithm;
  set pointSizeAlgorithm(value: (PointSizeFixedSizeAlgorithmProperties & { type: "fixed-size" }) | (PointSizeSplatAlgorithmProperties & { type: "splat" }));
  /**
   * The number of points to draw per display inch. This property determines the level of
   * detail in the visualization.
   *
   * @default 10
   */
  accessor pointsPerInch: number;
  /** The point cloud renderer type. */
  get type(): PointCloudRendererType;
  /**
   * Creates a deep clone of the renderer.
   *
   * @returns A deep clone of the
   * object that invoked this method.
   */
  clone(): PointCloudRenderer;
}