import type { JSONSupport } from "../../core/JSONSupport.js";
import type { GeometryUnion } from "../../geometry/types.js";
import type { GeometryOperationLengthUnit } from "./types.js";
import type { MeshProperties } from "../../geometry/Mesh.js";
import type { PolylineProperties } from "../../geometry/Polyline.js";
import type { PolygonProperties } from "../../geometry/Polygon.js";
import type { PointProperties } from "../../geometry/Point.js";
import type { MultipointProperties } from "../../geometry/Multipoint.js";
import type { ExtentProperties } from "../../geometry/Extent.js";

export interface DensifyParametersProperties extends Partial<Pick<DensifyParameters, "geodesic" | "lengthUnit" | "maxSegmentLength">> {
  /** The array of geometries to be densified. */
  geometries?: ((ExtentProperties & { type: "extent" }) | (MultipointProperties & { type: "multipoint" }) | (PointProperties & { type: "point" }) | (PolygonProperties & { type: "polygon" }) | (PolylineProperties & { type: "polyline" }) | (MeshProperties & { type: "mesh" }))[] | null;
}

/**
 * Input parameters for the [densify()](https://developers.arcgis.com/javascript/latest/references/core/rest/geometryService/#densify) method on
 * the GeometryService.
 *
 * @since 4.20
 * @see [densify()](https://developers.arcgis.com/javascript/latest/references/core/rest/geometryService/#densify)
 * @see [ArcGIS REST API - Densify](https://developers.arcgis.com/rest/services-reference/densify.htm)
 */
export default class DensifyParameters extends JSONSupport {
  constructor(properties?: DensifyParametersProperties);
  /**
   * If `true`, Geographic Coordinate System spatial references are used or
   * densify geodesic will be performed.
   */
  accessor geodesic: boolean | null | undefined;
  /** The array of geometries to be densified. */
  get geometries(): GeometryUnion[] | null | undefined;
  set geometries(value: ((ExtentProperties & { type: "extent" }) | (MultipointProperties & { type: "multipoint" }) | (PointProperties & { type: "point" }) | (PolygonProperties & { type: "polygon" }) | (PolylineProperties & { type: "polyline" }) | (MeshProperties & { type: "mesh" }))[] | null | undefined);
  /** The length unit of `maxSegmentLength`. For a list of valid units, see [esriSRUnitType Constants](https://resources.arcgis.com/en/help/arcobjects-cpp/componenthelp/index.html#/esriSRUnitType_Constants/000w00000042000000/) and [esriSRUnit2Type Constants](https://resources.arcgis.com/en/help/arcobjects-cpp/componenthelp/index.html#/esriSRUnit2Type_Constants/000w00000041000000/). */
  accessor lengthUnit: GeometryOperationLengthUnit | null | undefined;
  /**
   * All segments longer than `maxSegmentLength` are replaced with sequences of lines
   * no longer than `maxSegmentLength.`
   */
  accessor maxSegmentLength: number | null | undefined;
  /**
   * Converts an instance of  this class to its ArcGIS portal JSON representation.
   * See the [Using fromJSON()](https://developers.arcgis.com/javascript/latest/using-fromjson) topic in the Guide for more information.
   *
   * @returns The ArcGIS portal JSON representation of an instance of this class.
   */
  toJSON(): object;
}