import type Accessor from "../../../core/Accessor.js";
import type SnappingOptions from "../../../views/interactive/snapping/SnappingOptions.js";
import type { MapViewOrSceneView } from "../../../views/MapViewOrSceneView.js";
import type { SnappingOptionsProperties } from "../../../views/interactive/snapping/SnappingOptions.js";

export interface SnappingControlsViewModelProperties extends Partial<Pick<SnappingControlsViewModel, "view">> {
  /** 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. */
  snappingOptions?: SnappingOptionsProperties;
}

export type SnappingControlsViewModelState = "ready" | "disabled";

/**
 * Provides the logic for the [SnappingControls](https://developers.arcgis.com/javascript/latest/references/core/widgets/support/SnappingControls/) widget.
 *
 * @since 4.21
 * @see [SnappingControls](https://developers.arcgis.com/javascript/latest/references/core/widgets/support/SnappingControls/)
 * @see [SnappingOptions](https://developers.arcgis.com/javascript/latest/references/core/views/interactive/snapping/SnappingOptions/)
 * @see [Sketch](https://developers.arcgis.com/javascript/latest/references/core/widgets/Sketch/)
 */
export default class SnappingControlsViewModel extends Accessor {
  constructor(properties?: SnappingControlsViewModelProperties);
  /** 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. */
  get snappingOptions(): SnappingOptions;
  set snappingOptions(value: SnappingOptionsProperties);
  /**
   * The current state of the view model.
   *
   * @default "disabled"
   */
  get state(): SnappingControlsViewModelState;
  /** The view associated with the SnappingControls widget instance. */
  accessor view: MapViewOrSceneView | null | undefined;
}