import type Polyline from "../../geometry/Polyline.js";
import type { JSONSupport } from "../../core/JSONSupport.js";
import type { PolylineProperties } from "../../geometry/Polyline.js";

export interface LengthsParametersProperties extends Partial<Pick<LengthsParameters, "calculationType" | "geodesic" | "lengthUnit">> {
  /**
   * The array of polylines whose lengths are to be computed. The structure of
   * each polyline in the array is same as the structure of the JSON polyline objects returned by the ArcGIS REST API.
   */
  polylines?: PolylineProperties[] | null;
}

/**
 * Sets the length units and other parameters for the [lengths()](https://developers.arcgis.com/javascript/latest/api-reference/esri-rest-geometryService.html#lengths) operation.
 *
 * @since 4.0
 * @see [lengths()](https://developers.arcgis.com/javascript/latest/api-reference/esri-rest-geometryService.html#lengths)
 * @see [ArcGIS REST API - Lengths](https://developers.arcgis.com/rest/services-reference/lengths.htm)
 */
export default class LengthsParameters extends JSONSupport {
  constructor(properties?: LengthsParametersProperties);
  /**
   * 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 `preserve-shape`.
   * 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: "planar" | "geodesic" | "preserve-shape" | null | undefined;
  /**
   * If polylines are in a geographic coordinate system, then geodesic needs to be set to `true` in order to calculate the ellipsoidal
   * shortest path distance between each pair of the vertices in the polylines. If `lengthUnit` is not specified, the output is returned in meters.
   */
  accessor geodesic: boolean | null | undefined;
  /**
   * The length unit in which perimeters of polygons will be calculated.
   * For a list of valid units, see [linear unit codes](https://developers.arcgis.com/android/api-reference/reference/com/esri/arcgisruntime/geometry/LinearUnitId.html).
   */
  accessor lengthUnit: number | string;
  /**
   * The array of polylines whose lengths are to be computed. The structure of
   * each polyline in the array is same as the structure of the JSON polyline objects returned by the ArcGIS REST API.
   */
  get polylines(): Polyline[] | null | undefined;
  set polylines(value: PolylineProperties[] | null | undefined);
}