import type DistanceMeasurementAnalysis from "../../../analysis/DistanceMeasurementAnalysis.js";
import type AnalysisView2D from "./AnalysisView2D.js";
import type SnappingOptions from "../../interactive/snapping/SnappingOptions.js";
import type { AbortOptions } from "../../../core/promiseUtils.js";
import type { SystemOrLengthUnit } from "../../../core/units.js";
import type { DistanceMeasurementPlacementResult, DistanceMeasurementResult } from "../../analysis/DistanceMeasurement/types.js";
import type { SnappingOptionsProperties } from "../../interactive/snapping/SnappingOptions.js";

/**
 * Represents the analysis view of an [DistanceMeasurementAnalysis](https://developers.arcgis.com/javascript/latest/references/core/analysis/DistanceMeasurementAnalysis/)
 * after it has been added to [MapView.analyses](https://developers.arcgis.com/javascript/latest/references/core/views/MapView/#analyses).
 *
 * DistanceMeasurementAnalysisView2D is responsible for the rendering, computing and interacting with
 * [DistanceMeasurementAnalysis](https://developers.arcgis.com/javascript/latest/references/core/analysis/DistanceMeasurementAnalysis/).
 * The [result](https://developers.arcgis.com/javascript/latest/references/core/views/2d/analysis/DistanceMeasurementAnalysisView2D/#result) property contains the computed distance as well as the analytical method.
 *
 * Use the [place()](https://developers.arcgis.com/javascript/latest/references/core/views/2d/analysis/DistanceMeasurementAnalysisView2D/#place) method to initiate the interactive digitization of DistanceMeasurementAnalysis geometry.
 *
 * To enable modification of an existing DistanceMeasurementAnalysis geometry, set the [interactive](https://developers.arcgis.com/javascript/latest/references/core/views/2d/analysis/DistanceMeasurementAnalysisView2D/#interactive) property to `true`.
 *
 * Use [MapView.whenAnalysisView()](https://developers.arcgis.com/javascript/latest/references/core/views/MapView/#whenAnalysisView) to obtain the analysis view of an existing analysis.
 * This is conceptually similar to how layer views are retrieved for layers using [MapView.whenLayerView()](https://developers.arcgis.com/javascript/latest/references/core/views/MapView/#whenLayerView).
 *
 * ```js
 * // Retrieve analysis view for analysis
 * const analysis = new DistanceMeasurementAnalysis();
 * view.analyses.add(analysis); // add to the view
 * const analysisView = await view.whenAnalysisView(analysis);
 * ```
 *
 * @since 5.0
 */
export default abstract class DistanceMeasurementAnalysisView2D extends AnalysisView2D {
  /**
   * The distance measurement analysis associated with the analysis view.
   *
   * @since 5.0
   */
  get analysis(): DistanceMeasurementAnalysis;
  /**
   * Enables interactivity for the [analysis](https://developers.arcgis.com/javascript/latest/references/core/views/2d/analysis/DistanceMeasurementAnalysisView2D/#analysis). When set to `true` the input geometry can be edited interactively.
   *
   * @default false
   * @since 5.0
   */
  accessor interactive: boolean;
  /**
   * Result of the distance measurement analysis. The result object is created immediately and updated as the
   * measurement is computed.
   *
   * @since 5.0
   */
  get result(): DistanceMeasurementResult | null | undefined;
  /**
   * The [SnappingOptions](https://developers.arcgis.com/javascript/latest/references/core/views/interactive/snapping/SnappingOptions/) for sketching.
   * It supports [self](https://developers.arcgis.com/javascript/latest/references/core/views/interactive/snapping/SnappingOptions/#selfEnabled) and
   * [feature](https://developers.arcgis.com/javascript/latest/references/core/views/interactive/snapping/SnappingOptions/#featureEnabled) snapping.
   *
   * @since 5.0
   */
  get snappingOptions(): SnappingOptions;
  set snappingOptions(value: SnappingOptionsProperties);
  /**
   * The analysis view type.
   *
   * @since 5.0
   */
  get type(): "distance-measurement-view-2d";
  /**
   * Unit system (imperial, metric) or specific unit used for displaying the computed length in the view. This value is
   * useful when [DistanceMeasurementAnalysis.unit](https://developers.arcgis.com/javascript/latest/references/core/analysis/DistanceMeasurementAnalysis/#unit) is not explicitly set on the
   * [analysis](https://developers.arcgis.com/javascript/latest/references/core/views/2d/analysis/DistanceMeasurementAnalysisView2D/#analysis).
   *
   * @since 5.0
   */
  get unit(): SystemOrLengthUnit;
  /**
   * This property is `true` when the analysis is recomputing or updating its visualization.
   *
   * @since 5.0
   */
  get updating(): boolean;
  /**
   * When `true`, the [analysis](https://developers.arcgis.com/javascript/latest/references/core/views/2d/analysis/DistanceMeasurementAnalysisView2D/#analysis) is visualized in the view.
   *
   * @since 5.0
   */
  accessor visible: boolean;
  /**
   * Starts an interactive placement operation to create a new [DistanceMeasurementAnalysis](https://developers.arcgis.com/javascript/latest/references/core/analysis/DistanceMeasurementAnalysis/).
   *
   * The placement operation will finish when the user presses the escape key, double taps, or double clicks.
   * To stop the placing programmatically, pass an abort signal as an argument when calling the method.
   *
   * When placement operation completes successfully, the analysis will have a valid [DistanceMeasurementAnalysis.geometry](https://developers.arcgis.com/javascript/latest/references/core/analysis/DistanceMeasurementAnalysis/#geometry).
   *
   * @param options - An object specifying additional options.
   * @returns A promise which resolves when the operation is completed successfully or rejected if it is canceled.
   * @since 5.0
   */
  place(options?: AbortOptions | null | undefined): Promise<DistanceMeasurementPlacementResult>;
}