/**
 * Generalizes 2D geometries using Douglas-Peucker algorithm.
 *
 * ![Generalize operator](https://developers.arcgis.com/javascript/latest/assets/references/core/operators/generalize.png "Generalize operator")
 *
 * @since 4.31
 */
import type { LengthUnit } from "../../core/units.js";
import type { GeometryUnion, GeometryWithoutMeshUnion } from "../types.js";

export interface Options {
  /**
   * Preserves degenerate parts.
   * The operator will try to output three distinct vertices for closed polyline paths and polygon rings,
   * and it will output two distinct vertices for open polyline paths.
   *
   * When set to `true`, the degenerate parts of the geometries will be removed from the output.
   * This may not be desirable for displaying the geometries.
   *
   * @default false
   */
  removeDegenerateParts?: boolean;
  /**
   * The length unit of `maxDeviation`.
   * The default is the input geometry's spatial reference unit.
   * An error will be thrown if this is set for Geographic Coordinate Systems.
   */
  unit?: LengthUnit;
}

/**
 * Performs the generalize operation on the input geometry.
 *
 * @param geometry - The input geometry to be generalized.
 * @param maxDeviation - The maximum allowed deviation from the generalized geometry to the original geometry.
 * If maxDeviation <= 0 the operator returns the input geometry.
 * Unless the `unit` option is set, the default is the spatial reference unit of `geometry`.
 * @param options - Additional options.
 * @returns Returns the generalized geometry or null.
 * @example
 * // Generalize a polyline geometry
 * const generalizedPolyline = generalizeOperator.execute(polyline, 10);
 */
export function execute(geometry: GeometryUnion, maxDeviation: number, options?: Options): GeometryWithoutMeshUnion | null | undefined;

/**
 * Performs the generalize operation on the input geometries.
 *
 * @param geometries - The input geometries to be generalized.
 * All the geometries must have the same spatial reference.
 * @param maxDeviation - The maximum allowed deviation from the generalized geometry to the original geometry.
 * If the value is less than or equal to zero, then the operator returns the input geometries.
 * Unless the `unit` option is set, the default is the spatial reference unit of `geometries`.
 * @param options - Additional options.
 * @returns Returns an array of generalized geometries. Geometries with a dimension of < 1 are simply passed along.
 */
export function executeMany(geometries: GeometryUnion[], maxDeviation: number, options?: Options): GeometryWithoutMeshUnion[];

/**
 * Indicates if the operator supports input geometries that contain curves.
 * The value will always be `true`. This will produce densified output geometries.
 */
export const supportsCurves: boolean;