import type Extent from "../../geometry/Extent.js";
import type Point from "../../geometry/Point.js";
import type Polygon from "../../geometry/Polygon.js";
import type MosaicRule from "../../layers/support/MosaicRule.js";
import type RasterFunction from "../../layers/support/RasterFunction.js";
import type TimeExtent from "../../time/TimeExtent.js";
import type { JSONSupport } from "../../core/JSONSupport.js";
import type { PolygonProperties } from "../../geometry/Polygon.js";
import type { ExtentProperties } from "../../geometry/Extent.js";
import type { MosaicRuleProperties } from "../../layers/support/MosaicRule.js";
import type { RasterFunctionProperties } from "../../layers/support/RasterFunction.js";
import type { PointProperties } from "../../geometry/Point.js";
import type { TimeExtentProperties } from "../../time/TimeExtent.js";

export interface ImageHistogramParametersProperties {
  /**
   * Input geometry that defines the area of interest for which the histograms and statistics will be computed.
   * The geometry can be an [Extent](https://developers.arcgis.com/javascript/latest/references/core/geometry/Extent/) or a [Polygon](https://developers.arcgis.com/javascript/latest/references/core/geometry/Polygon/).
   */
  geometry?: (ExtentProperties & { type: "extent" }) | (PolygonProperties & { type: "polygon" }) | null;
  /**
   * Specifies the [mosaic rule](https://developers.arcgis.com/javascript/latest/references/core/layers/support/MosaicRule/) on how individual images should be mosaicked
   * when the histogram is computed. When a mosaic rule is not specified, the current settings on the [ImageryLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/ImageryLayer/) will be used.
   */
  mosaicRule?: MosaicRuleProperties | null;
  /**
   * Specifies the pixel size (or the resolution). If pixel size is not specified, `pixelSize` will default to the base resolution of the image service.
   * The raster at the specified pixel size in the mosaic dataset will be used for the histogram calculation.
   *
   * @example
   * // set the pixel size parameter to match the current
   * // resolution of the view and spatial reference
   * let pixelSize = {
   *   x:view.resolution,
   *   y:view.resolution,
   *   spatialReference: view.spatialReference
   * }
   * // set the histogram parameters to request
   * // data for the current view extent and resolution
   * let params = new ImageHistogramParameters({
   *   geometry:  view.extent,
   *   pixelSize: pixelSize
   * });
   *
   * // request for histograms for the specified parameters
   * layer.computeHistograms(params).then((results) =>{
   *   // results are returned and process it as needed.
   *   console.log("histograms", result);
   * })
   * .catch(function(err){
   *   console.log("err", err)
   * });
   */
  pixelSize?: PointProperties;
  /**
   * Specifies the [raster function](https://developers.arcgis.com/javascript/latest/references/core/layers/support/RasterFunction/) from which to compute the statistics and histogram.
   * The rasterFunction defines how the image should be processed.  When a rasterFunction is not specified, the current
   * settings on the [ImageryLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/ImageryLayer/) will be used.
   *
   * @since 4.27
   */
  rasterFunction?: RasterFunctionProperties | null;
  /**
   * The [time extent](https://developers.arcgis.com/javascript/latest/references/core/time/TimeExtent/) for which to compute the statistics and histogram.
   * The time parameter is supported at ArcGIS Server 10.8 and later.
   */
  timeExtent?: TimeExtentProperties | null;
}

/**
 * Input parameters for the [ImageryLayer.computeHistograms()](https://developers.arcgis.com/javascript/latest/references/core/layers/ImageryLayer/#computeHistograms) or
 * [ImageryLayer.computeStatisticsHistograms()](https://developers.arcgis.com/javascript/latest/references/core/layers/ImageryLayer/#computeStatisticsHistograms)
 * method on [ImageryLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/ImageryLayer/), or the [ImageryTileLayer.computeStatisticsHistograms()](https://developers.arcgis.com/javascript/latest/references/core/layers/ImageryTileLayer/#computeStatisticsHistograms)
 * method on [ImageryTileLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/ImageryTileLayer/).
 *
 * @since 4.20
 * @see [ImageryLayer.computeHistograms()](https://developers.arcgis.com/javascript/latest/references/core/layers/ImageryLayer/#computeHistograms)
 * @see [ImageryLayer.computeStatisticsHistograms()](https://developers.arcgis.com/javascript/latest/references/core/layers/ImageryLayer/#computeStatisticsHistograms)
 * @see [ImageryTileLayer.computeStatisticsHistograms()](https://developers.arcgis.com/javascript/latest/references/core/layers/ImageryTileLayer/#computeStatisticsHistograms)
 */
export default class ImageHistogramParameters extends JSONSupport {
  constructor(properties?: ImageHistogramParametersProperties);
  /**
   * Input geometry that defines the area of interest for which the histograms and statistics will be computed.
   * The geometry can be an [Extent](https://developers.arcgis.com/javascript/latest/references/core/geometry/Extent/) or a [Polygon](https://developers.arcgis.com/javascript/latest/references/core/geometry/Polygon/).
   */
  get geometry(): Extent | Polygon | null | undefined;
  set geometry(value: (ExtentProperties & { type: "extent" }) | (PolygonProperties & { type: "polygon" }) | null | undefined);
  /**
   * Specifies the [mosaic rule](https://developers.arcgis.com/javascript/latest/references/core/layers/support/MosaicRule/) on how individual images should be mosaicked
   * when the histogram is computed. When a mosaic rule is not specified, the current settings on the [ImageryLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/ImageryLayer/) will be used.
   */
  get mosaicRule(): MosaicRule | null | undefined;
  set mosaicRule(value: MosaicRuleProperties | null | undefined);
  /**
   * Specifies the pixel size (or the resolution). If pixel size is not specified, `pixelSize` will default to the base resolution of the image service.
   * The raster at the specified pixel size in the mosaic dataset will be used for the histogram calculation.
   *
   * @example
   * // set the pixel size parameter to match the current
   * // resolution of the view and spatial reference
   * let pixelSize = {
   *   x:view.resolution,
   *   y:view.resolution,
   *   spatialReference: view.spatialReference
   * }
   * // set the histogram parameters to request
   * // data for the current view extent and resolution
   * let params = new ImageHistogramParameters({
   *   geometry:  view.extent,
   *   pixelSize: pixelSize
   * });
   *
   * // request for histograms for the specified parameters
   * layer.computeHistograms(params).then((results) =>{
   *   // results are returned and process it as needed.
   *   console.log("histograms", result);
   * })
   * .catch(function(err){
   *   console.log("err", err)
   * });
   */
  get pixelSize(): Point;
  set pixelSize(value: PointProperties);
  /**
   * Specifies the [raster function](https://developers.arcgis.com/javascript/latest/references/core/layers/support/RasterFunction/) from which to compute the statistics and histogram.
   * The rasterFunction defines how the image should be processed.  When a rasterFunction is not specified, the current
   * settings on the [ImageryLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/ImageryLayer/) will be used.
   *
   * @since 4.27
   */
  get rasterFunction(): RasterFunction | null | undefined;
  set rasterFunction(value: RasterFunctionProperties | null | undefined);
  /**
   * The [time extent](https://developers.arcgis.com/javascript/latest/references/core/time/TimeExtent/) for which to compute the statistics and histogram.
   * The time parameter is supported at ArcGIS Server 10.8 and later.
   */
  get timeExtent(): TimeExtent | null | undefined;
  set timeExtent(value: TimeExtentProperties | null | undefined);
}