import type SpatialReference from "../../geometry/SpatialReference.js";
import type { JSONSupport } from "../../core/JSONSupport.js";
import type { GeometryUnion } from "../../geometry/types.js";
import type { Transformation } from "../types.js";
import type { SpatialReferenceProperties } from "../../geometry/SpatialReference.js";

export interface ProjectParametersProperties extends Partial<Pick<ProjectParameters, "geometries" | "transformation" | "transformForward">> {
  /**
   * The spatial reference to which you are projecting the geometries.
   *
   * @since 4.4
   */
  outSpatialReference?: SpatialReferenceProperties;
}

/**
 * Defines the projection parameters used when calling
 * [project()](https://developers.arcgis.com/javascript/latest/api-reference/esri-rest-geometryService.html#project).
 *
 * @since 4.0
 * @see [project()](https://developers.arcgis.com/javascript/latest/api-reference/esri-rest-geometryService.html#project)
 * @see [ArcGIS REST API - Project](https://developers.arcgis.com/rest/services-reference/project.htm)
 */
export default class ProjectParameters extends JSONSupport {
  constructor(properties?: ProjectParametersProperties);
  /** The input geometries to project. */
  accessor geometries: GeometryUnion[];
  /**
   * The spatial reference to which you are projecting the geometries.
   *
   * @since 4.4
   */
  get outSpatialReference(): SpatialReference;
  set outSpatialReference(value: SpatialReferenceProperties);
  /**
   * The well-known id {wkid:number} or well-known text {wkt:string} of the datum
   * transformation to be applied to the projected geometries.
   * See [Datum transformations](https://developers.arcgis.com/rest/services-reference/enterprise/using-spatial-references.htm)
   * for a list of valid datum transformations that may be used here.
   *
   * If a transformation is specified, a value must also be specified in the [transformForward](https://developers.arcgis.com/javascript/latest/api-reference/esri-rest-support-ProjectParameters.html#transformForward)
   * property.
   */
  accessor transformation: Transformation | null | undefined;
  /**
   * Indicates whether to transform forward or not. The forward or reverse direction of transformation is implied in
   * the name of the transformation.
   */
  accessor transformForward: boolean | 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(): any;
}