/**
 * Provides a utility method that normalizes geometries that intersect the central
 * meridian or fall outside the world extent so they stay within the coordinate system
 * of the view. Support is limited to geometries in Web Mercator and WGS-84 spatial references.
 *
 * @since 4.3
 */
import type Extent from "../Extent.js";
import type Mesh from "../Mesh.js";
import type Multipoint from "../Multipoint.js";
import type Point from "../Point.js";
import type Polygon from "../Polygon.js";
import type Polyline from "../Polyline.js";
import type { RequestOptions } from "../../request/types.js";

export type Geometry = Extent | Multipoint | Point | Polygon | Polyline | Mesh;

/**
 * Normalizes geometries that intersect the central meridian or fall outside the
 * world extent so they stay within the coordinate system of the view. Only supported
 * for Web Mercator and WGS84 spatial references.
 *
 * @param geometries - An array of geometries to normalize.
 * @param url - A geometry service URL used to
 * perform the normalization. If this value is `null` then the default geometry service URL in
 * [esriConfig.geometryServiceUrl](https://developers.arcgis.com/javascript/latest/references/core/config/#Config-geometryServiceUrl) is used.
 * @param requestOptions - Additional [options](https://developers.arcgis.com/javascript/latest/references/core/request/#request) to be used for the data request.
 * @returns Resolves to an array of the normalized geometries.
 * @example
 * // create a non-normalized line that crosses the dateline
 * const polyline = new Polyline({
 *   paths: [
 *     [170, 52.68],
 *     [190, 49.5]
 *   ]
 * });
 *
 * normalizeUtils.normalizeCentralMeridian([polyline])
 *   .then(function(polylines){
 *     // returns a line representing the same geometry, but
 *     // now is normalized between -180 and 180 on the x-coordinate.
 *     // but represents the same feature
 *     const graphic = new Graphic({
 *       geometry: polylines[0],
 *       symbol: { type: "simple-line" }
 *     });
 */
export function normalizeCentralMeridian(geometries: (Geometry | null | undefined) | (Geometry | null | undefined)[], url?: string | null, requestOptions?: RequestOptions): Promise<(Geometry | null | undefined)[]>;

/**
 * Returns an [Extent](https://developers.arcgis.com/javascript/latest/references/core/geometry/Extent/) over the dateline that is smaller than the normalized width if it visually contains the
 * geometry. The input geometry must be normalized and its [Geometry.spatialReference](https://developers.arcgis.com/javascript/latest/references/core/geometry/Geometry/#spatialReference) must be Web Mercator or WGS84.
 *
 * @param geometry - The geometry used to create the denormalized extent. The geometry should be
 * a [Polygon](https://developers.arcgis.com/javascript/latest/references/core/geometry/Polygon/), [Polyline](https://developers.arcgis.com/javascript/latest/references/core/geometry/Polyline/), or a
 * [Multipoint](https://developers.arcgis.com/javascript/latest/references/core/geometry/Multipoint/) geometry.
 * This method returns `null` if a [Point](https://developers.arcgis.com/javascript/latest/references/core/geometry/Point/) or a [Multipoint](https://developers.arcgis.com/javascript/latest/references/core/geometry/Multipoint/)
 * with only one point is used as the input geometry.
 * It returns a cloned extent if an [Extent](https://developers.arcgis.com/javascript/latest/references/core/geometry/Extent/) is used as the input geometry.
 * @returns The denormalized extent. The new extent is either the same as the normal extent of the geometry
 * or a smaller extent.
 * @since 4.21
 * @example
 * // create an extent that goes over the dateline
 * // as the points are cross the dateline
 * const multipoint = new Multipoint({
 *   points: [
 *     [158.6082458495678, 59.91028747107214],
 *     [-145.98220825200923, 60.23981116998903]
 *   ]
 * });
 * const extent = normalizeUtils.getDenormalizedExtent(multipoint);
 */
export function getDenormalizedExtent(geometry: Polygon | Polyline | Multipoint | Extent | null | undefined): Extent | null | undefined;