import type Polyline from "../../geometry/Polyline.js";
import type { JSONSupport, JSONSupportMixinProperties } from "../../core/JSONSupport.js";
import type { PolylineProperties } from "../../geometry/Polyline.js";

export interface TrimExtendParametersProperties extends JSONSupportMixinProperties, Partial<Pick<TrimExtendParameters, "extendHow">> {
  /**
   * The array of polylines to trim or extend. The structure of each geometry in the array is the same as the structure of the JSON polyline
   * objects returned by the ArcGIS REST API.
   */
  polylines?: PolylineProperties[] | null;
  /**
   * A polyline used as a guide for trimming or extending input polylines. The structure of the polyline is the same as the structure of the
   * JSON polyline object returned by the ArcGIS REST API.
   */
  trimExtendTo?: PolylineProperties | null;
}

/**
 * Used to set the parameters for the [trimExtend()](https://developers.arcgis.com/javascript/latest/api-reference/esri-rest-geometryService.html#trimExtend) operation.
 *
 * @since 4.20
 * @see [trimExtend()](https://developers.arcgis.com/javascript/latest/api-reference/esri-rest-geometryService.html#trimExtend)
 * @see [ArcGIS REST API - Trim/Extend](https://developers.arcgis.com/rest/services-reference/trim-extend.htm)
 */
export default class TrimExtendParameters extends JSONSupport {
  constructor(properties?: TrimExtendParametersProperties);
  /**
   * A flag used with the `trimExtend` operation.
   *
   * Possible Value | Description
   * ---------------|-------------
   * default-curve-extension | The extension considers both ends of the path. The old ends remain and new points are added to the extended ends. The new points have attributes that are extrapolated from existing adjacent segments.
   * relocate-ends | When an extension is performed at an end, relocate the end point to the new position.
   * keep-end-attributes | When an extension is performed at an end, do not extrapolate the end segments attributes for the new point. Instead, the attributes will be the same as the current end.
   * no-end-attributes | When an extension is performed at an end, do not extrapolate the end segments attributes for the new point. Instead the attributes will be empty.
   * no-extend-at-from | Do not extend the 'from' end of any path.
   * no-extend-at-to | Do not extend the 'to' end of any path.
   *
   * @default "default-curve-extension"
   */
  accessor extendHow: "default-curve-extension" | "relocate-ends" | "keep-end-attributes" | "no-end-attributes" | "no-extend-at-from" | "no-extend-at-to";
  /**
   * The array of polylines to trim or extend. The structure of each geometry in the array is the same as the structure of the JSON polyline
   * objects returned by the ArcGIS REST API.
   */
  get polylines(): Polyline[] | null | undefined;
  set polylines(value: PolylineProperties[] | null | undefined);
  /**
   * A polyline used as a guide for trimming or extending input polylines. The structure of the polyline is the same as the structure of the
   * JSON polyline object returned by the ArcGIS REST API.
   */
  get trimExtendTo(): Polyline | null | undefined;
  set trimExtendTo(value: PolylineProperties | null | undefined);
}