import type GeographicTransformationStep from "./GeographicTransformationStep.js";
import type { ClonableMixin } from "../../../core/Clonable.js";
import type { JSONSupport } from "../../../core/JSONSupport.js";
import type { GeographicTransformationStepProperties } from "./GeographicTransformationStep.js";

export interface GeographicTransformationProperties {
  /**
   * An ordered list of geographic transformation steps that represent the process of transforming coordinates from one geographic coordinate system to another.
   * The steps are applied in the order in which they are defined.
   *
   * To define the steps use the [GeographicTransformationStep](https://developers.arcgis.com/javascript/latest/references/core/geometry/operators/support/GeographicTransformationStep/) module.
   *
   * @default []
   */
  steps?: GeographicTransformationStepProperties[];
}

/**
 * Create a geographic transformation that can be used to project 2D geometries between different geographic coordinate systems to ensure that data is properly aligned within a map. These transformations are used to transform coordinates between spatial references that have different geographic coordinate systems, and thus different datums.
 *
 * A geographic transformation converts everything that needs to be changed, including the units, prime meridian, and the ellipsoid. The transformation is defined by a series of [steps](https://developers.arcgis.com/javascript/latest/references/core/geometry/operators/support/GeographicTransformation/#steps), each of which is defined by a well-known text (WKT) string or a well-known ID (WKID).
 * Using the most suitable transformation ensures the best possible accuracy when
 * converting geometries from one spatial reference to another.
 *
 * The `geographicTransformationUtils` module provides the [getTransformation()](https://developers.arcgis.com/javascript/latest/references/core/geometry/operators/support/geographicTransformationUtils/#getTransformation) and
 * [getTransformations()](https://developers.arcgis.com/javascript/latest/references/core/geometry/operators/support/geographicTransformationUtils/#getTransformations) methods which return the default geographic transformation
 * for the given projection or a list of suitable geographic transformations.
 *
 * > [!WARNING]
 * >
 * > **Known Limitations**
 * >
 * > Currently, the client-side [projectOperator](https://developers.arcgis.com/javascript/latest/references/core/geometry/operators/projectOperator/) only supports
 * > [equation-based geographic transformations](https://developers.arcgis.com/rest/services-reference/enterprise/using-spatial-references.htm).
 *
 * @since 4.32
 * @see [projectOperator](https://developers.arcgis.com/javascript/latest/references/core/geometry/operators/projectOperator/)
 * @see [shapePreservingProjectOperator](https://developers.arcgis.com/javascript/latest/references/core/geometry/operators/shapePreservingProjectOperator/)
 * @see [Spatial References](https://developers.arcgis.com/documentation/spatial-references/)
 * @see [Coordinate systems, map projections, and transformations](https://pro.arcgis.com/en/pro-app/latest/help/mapping/properties/coordinate-systems-and-projections.htm)
 * @see [Geographic datum transformations](https://pro.arcgis.com/en/pro-app/latest/help/mapping/properties/geographic-coordinate-system-transformation.htm)
 * @see [Sample - Client-side projection](https://developers.arcgis.com/javascript/latest/sample-code/client-projection/)
 */
export default class GeographicTransformation extends GeographicTransformationSuperclass {
  constructor(properties?: GeographicTransformationProperties);
  /**
   * An ordered list of geographic transformation steps that represent the process of transforming coordinates from one geographic coordinate system to another.
   * The steps are applied in the order in which they are defined.
   *
   * To define the steps use the [GeographicTransformationStep](https://developers.arcgis.com/javascript/latest/references/core/geometry/operators/support/GeographicTransformationStep/) module.
   *
   * @default []
   */
  get steps(): GeographicTransformationStep[];
  set steps(value: GeographicTransformationStepProperties[]);
  /**
   * Returns the inverse of this geographic transformation.
   * The inverse of a transformation converts coordinates using the same method and parameters, but in the opposite
   * direction of the original object. For example if the original object represents the `NAD_1983_HARN_To_NAD_1983_NSRS2007_1`
   * transformation, then the inverse will transform from `NAD 83 (NSRS 2007)` to `NAD 83 (HARN)`.
   */
  getInverse(): GeographicTransformation;
}
declare const GeographicTransformationSuperclass: typeof JSONSupport & typeof ClonableMixin