import type Polygon from "../../geometry/Polygon.js";
import type { JSONSupport } from "../../core/JSONSupport.js";
import type { PolygonProperties } from "../../geometry/Polygon.js";

export interface AreasAndLengthsParametersProperties extends Partial<Pick<AreasAndLengthsParameters, "areaUnit" | "calculationType" | "lengthUnit">> {
  /** Polygon geometries for which to compute areas and lengths. */
  polygons?: PolygonProperties[] | null;
}

export type CalculationTypeKebabCase = "preserve-shape" | "planar" | "geodesic";

export type AreaUnitKebabCase = "acres" | "ares" | "hectares" | "square-miles" | "square-kilometers" | "square-meters" | "square-feet" | "square-yards";

export type LengthUnit = "meters" | "feet" | "kilometers" | "miles" | "nautical-miles" | "yards";

/**
 * Input parameters for the [areasAndLengths()](https://developers.arcgis.com/javascript/latest/references/core/rest/geometryService/#areasAndLengths)
 * method on the [geometryService](https://developers.arcgis.com/javascript/latest/references/core/rest/geometryService/).
 *
 * @since 4.20
 * @see [areasAndLengths()](https://developers.arcgis.com/javascript/latest/references/core/rest/geometryService/#areasAndLengths)
 * @see [ArcGIS REST API - Areas and Lengths](https://developers.arcgis.com/rest/services-reference/areas-and-lengths.htm)
 */
export default class AreasAndLengthsParameters extends JSONSupport {
  constructor(properties?: AreasAndLengthsParametersProperties);
  /**
   * The area unit in which areas of polygons will be calculated. Use the strings listed below or
   * [any other valid area unit](https://developers.arcgis.com/java/v200/api-reference/reference/com.esri.arcgisruntime/com/esri/arcgisruntime/geometry/AreaUnitId.html#ACRES).
   */
  accessor areaUnit: AreaUnitKebabCase | null | undefined;
  /**
   * Defines the type of calculation for the geometry. The type can be one of the following:
   *
   * Value | Description
   * ------|------------
   * planar | Planar measurements use 2D Cartesian mathematics to calculate length. Use this type if the length needs to be calculated in the input spatial reference. Otherwise use `preserveShape`.
   * geodesic | Use this type to calculate an area or length using only the vertices of the polygon to define the lines connecting the vertices as geodesic segments independent of the actual shape of the polygon. **Note:** a geodesic segment is the shortest path between two points on an ellipsoid.
   * preserve-shape | Calculate the area or length of the geometry on the surface of the Earth ellipsoid (for geometries defined in a projected or geographic coordinate system). This method preserves the shape of the geometry in its coordinate system, which means the true area or length will be calculated for the geometry that is displayed on the map.
   */
  accessor calculationType: CalculationTypeKebabCase | null | undefined;
  /**
   * The length unit in which perimeters of polygons will be calculated.
   * Use one of the possible values listed below or any of the
   * [numeric codes for linear units](https://developers.arcgis.com/android/api-reference/reference/com/esri/arcgisruntime/geometry/LinearUnitId.html).
   */
  accessor lengthUnit: LengthUnit | null | undefined;
  /** Polygon geometries for which to compute areas and lengths. */
  get polygons(): Polygon[] | null | undefined;
  set polygons(value: PolygonProperties[] | null | undefined);
}