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 { ClonableMixin } from "../../core/Clonable.js";
import type { JSONSupport } from "../../core/JSONSupport.js";
import type { ExtentProperties } from "../../geometry/Extent.js";
import type { PolygonProperties } from "../../geometry/Polygon.js";
import type { MosaicRuleProperties } from "../../layers/support/MosaicRule.js";
import type { PointProperties } from "../../geometry/Point.js";

export interface ImageVolumeParametersProperties extends Partial<Pick<ImageVolumeParameters, "baseType" | "constantZ">> {
  /** An array of geometries containing [extents](https://developers.arcgis.com/javascript/latest/references/core/geometry/Extent/) or [polygons](https://developers.arcgis.com/javascript/latest/references/core/geometry/Polygon/). */
  geometries?: (PolygonProperties & { type: "polygon" })[] | (ExtentProperties & { type: "extent" })[];
  /**
   * Specifies the [mosaic rule](https://developers.arcgis.com/javascript/latest/references/core/layers/support/MosaicRule/) on how individual images should be mosaicked
   * when the measure is computed. When a mosaic rule is not specified, the current settings on the [ImageryLayer.mosaicRule](https://developers.arcgis.com/javascript/latest/references/core/layers/ImageryLayer/#mosaicRule) will be used.
   */
  mosaicRule?: MosaicRuleProperties | null;
  /**
   * Specifies the pixel size. 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 volume calculation.
   */
  pixelSize?: PointProperties | null;
}

/**
 * Surface type of the base elevation plane. The value for each base elevation plane described in the following table:
 *
 * Type | Description
 * ------|------
 * constant | A user defined value that defines the constant z-value for the base surface.
 * plane   | Best fitting plane.
 * minimum | The lowest elevation on the perimeter of the [geometries](https://developers.arcgis.com/javascript/latest/references/core/rest/support/ImageVolumeParameters/#geometries).
 * maximum | The highest elevation on the perimeter of the [geometries](https://developers.arcgis.com/javascript/latest/references/core/rest/support/ImageVolumeParameters/#geometries).
 * average | The average elevation on the perimeter of the [geometries](https://developers.arcgis.com/javascript/latest/references/core/rest/support/ImageVolumeParameters/#geometries).
 *
 * @see [baseType](https://developers.arcgis.com/javascript/latest/references/core/rest/support/ImageVolumeParameters/#baseType)
 */
export type BaseType = "constant" | "plane" | "minimum" | "maximum" | "average";

/**
 * Input parameters for the [ImageryLayer.calculateVolume()](https://developers.arcgis.com/javascript/latest/references/core/layers/ImageryLayer/#calculateVolume)
 * method on [ImageryLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/ImageryLayer/).
 *
 * @since 4.32
 * @see [ArcGIS REST API - Compute Pixel Location](https://developers.arcgis.com/rest/services-reference/enterprise/calculate-volume)
 * @see [ImageryLayer.calculateVolume()](https://developers.arcgis.com/javascript/latest/references/core/layers/ImageryLayer/#calculateVolume)
 * @see [ImageVolumeResult](https://developers.arcgis.com/javascript/latest/references/core/rest/support/ImageVolumeResult/)
 */
export default class ImageVolumeParameters extends ImageVolumeParametersSuperclass {
  constructor(properties?: ImageVolumeParametersProperties);
  /**
   * Surface type of the base elevation plane.
   * The value for each base elevation plane described in the following table:
   *
   * Type | Description
   * ------|------
   * constant | A user defined value that defines the constant z-value for the base surface.
   * plane   | Best fitting plane.
   * minimum | The lowest elevation on the perimeter of the [geometries](https://developers.arcgis.com/javascript/latest/references/core/rest/support/ImageVolumeParameters/#geometries).
   * maximum | The highest elevation on the perimeter of the [geometries](https://developers.arcgis.com/javascript/latest/references/core/rest/support/ImageVolumeParameters/#geometries).
   * average | The average elevation on the perimeter of the [geometries](https://developers.arcgis.com/javascript/latest/references/core/rest/support/ImageVolumeParameters/#geometries).
   *
   * @default "plane"
   */
  accessor baseType: BaseType;
  /** Constant Z value. */
  accessor constantZ: number | null;
  /** An array of geometries containing [extents](https://developers.arcgis.com/javascript/latest/references/core/geometry/Extent/) or [polygons](https://developers.arcgis.com/javascript/latest/references/core/geometry/Polygon/). */
  get geometries(): Polygon[] | Extent[];
  set geometries(value: (PolygonProperties & { type: "polygon" })[] | (ExtentProperties & { type: "extent" })[]);
  /**
   * Specifies the [mosaic rule](https://developers.arcgis.com/javascript/latest/references/core/layers/support/MosaicRule/) on how individual images should be mosaicked
   * when the measure is computed. When a mosaic rule is not specified, the current settings on the [ImageryLayer.mosaicRule](https://developers.arcgis.com/javascript/latest/references/core/layers/ImageryLayer/#mosaicRule) will be used.
   */
  get mosaicRule(): MosaicRule | null | undefined;
  set mosaicRule(value: MosaicRuleProperties | null | undefined);
  /**
   * Specifies the pixel size. 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 volume calculation.
   */
  get pixelSize(): Point | null | undefined;
  set pixelSize(value: PointProperties | null | undefined);
}
declare const ImageVolumeParametersSuperclass: typeof JSONSupport & typeof ClonableMixin