/// <reference path="../../index.d.ts" />
import type Graphic from "@arcgis/core/Graphic.js";
import type CreateFeaturesWorkflow from "@arcgis/core/widgets/Editor/CreateFeaturesWorkflow.js";
import type UpdateWorkflow from "@arcgis/core/widgets/Editor/UpdateWorkflow.js";
import type SketchLabelOptions from "@arcgis/core/views/interactive/sketch/SketchLabelOptions.js";
import type SelectionManager from "@arcgis/core/views/SelectionManager.js";
import type SnappingOptions from "@arcgis/core/views/interactive/snapping/SnappingOptions.js";
import type SketchTooltipOptions from "@arcgis/core/views/interactive/sketch/SketchTooltipOptions.js";
import type { CreateFeaturesCreationInfo, EditorStartMergeFeaturesWorkflowOptions, EditorStartSplitFeatureWorkflowOptions } from "@arcgis/core/widgets/Editor.js";
import type { PublicLitElement as LitElement } from "@arcgis/lumina";
import type { ArcgisReferenceElement, IconName } from "../types.js";
import type { EditorSketchUpdateEvent, EditorSketchCreateEvent, FeatureInfo, LayerInfo, State, SupportingWidgetDefaults } from "@arcgis/core/widgets/Editor/types.js";
import type { MapViewOrSceneView } from "@arcgis/core/views/MapViewOrSceneView.js";
import type { HeadingLevel } from "@arcgis/core/widgets/support/types.js";
import type { Icon } from "@esri/calcite-components/components/calcite-icon";

/**
 * The Editor component provides an out-of-the-box editing experience to help streamline editing within a web application.
 *
 * @since 4.28
 */
export abstract class ArcgisEditor extends LitElement {
  /**
   * A property indicating the current active workflow. This is either
   * [CreateFeaturesWorkflow](https://developers.arcgis.com/javascript/latest/references/core/widgets/Editor/CreateFeaturesWorkflow/) or [UpdateWorkflow](https://developers.arcgis.com/javascript/latest/references/core/widgets/Editor/UpdateWorkflow/).
   */
  get activeWorkflow(): CreateFeaturesWorkflow | UpdateWorkflow | null | undefined;
  /**
   * If true, the component will not be destroyed automatically when it is
   * disconnected from the document. This is useful when you want to move the
   * component to a different place on the page, or temporarily hide it. If this
   * is set, make sure to call the [destroy()](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-editor/#destroy) method when you are done to
   * prevent memory leaks.
   *
   * @default false
   */
  accessor autoDestroyDisabled: boolean;
  /**
   * Indicates the heading level to use for title of the component. By default, the title (i.e. "Editor") is rendered
   * as a level 4 heading (e.g. `<h4>Editor</h4>`). Depending on the component's placement
   * in your app, you may need to adjust this heading for proper semantics. This is
   * important for meeting accessibility standards.
   *
   * @default 4
   * @since 4.20
   * @see [Heading Elements](https://developer.mozilla.org/docs/Web/HTML/Element/Heading_Elements)
   * @example
   * // "Editor" will render as an <h3>
   * editor.headingLevel = 3;
   */
  accessor headingLevel: HeadingLevel;
  /**
   * Indicates whether to hide the "create features" section of the component in the default view.
   *
   * @default false
   * @since 5.0
   */
  accessor hideCreateFeaturesSection: boolean;
  /**
   * Indicates whether to hide the "edit features" section of the component in the default view.
   *
   * @default false
   * @since 5.0
   */
  accessor hideEditFeaturesSection: boolean;
  /**
   * Indicates whether to hide the sketch labels toggle.
   *
   * @default false
   * @since 5.0
   */
  accessor hideLabelsToggle: boolean;
  /**
   * Indicates whether to hide the "Merge features" button in contexts where that command is available. Default value is `true`.
   *
   * @default false
   * @since 5.0
   */
  accessor hideMergeButton: boolean;
  /**
   * Indicates whether to hide the settings menu. This menu contains the snapping and tooltips settings.
   *
   * @default false
   * @since 5.0
   */
  accessor hideSettingsMenu: boolean;
  /**
   * Determines whether the component should display an embedded Sketch component to provide graphical controls for choosing drawing tools.
   *
   * @default false
   * @since 5.0
   */
  accessor hideSketch: boolean;
  /**
   * Indicates whether to hide the `enabledToggle` (Enable snapping). This toggles
   * the [SnappingOptions#enabled](https://developers.arcgis.com/javascript/latest/references/core/views/interactive/snapping/SnappingOptions/#enabled) property.
   * > [!WARNING]
   * >
   * > **Note**
   * >
   * > It is recommended to set `SnappingControls.snappingOptions.enabled = true` if `enabledToggle` is set to `false`.
   * > This is because `selfEnabledToggle` and `featureEnabledToggle` require snapping globally to be enabled in order to be interactive. Otherwise, these toggles will not be responsive.
   *
   * @default false
   * @since 5.0
   */
  accessor hideSnappingControlsElementsEnabledToggle: boolean;
  /**
   * Indicates whether to hide the `featureEnabledToggle` (Feature to feature). This toggles
   * the [SnappingOptions#featureEnabled](https://developers.arcgis.com/javascript/latest/references/core/views/interactive/snapping/SnappingOptions/#featureEnabled) property.
   *
   * @default false
   * @since 5.0
   */
  accessor hideSnappingControlsElementsFeatureEnabledToggle: boolean;
  /**
   * Indicates whether to hide the `gridControls` (configuration of the snapping grid).
   *
   * @default false
   * @since 5.1
   */
  accessor hideSnappingControlsElementsGridControls: boolean;
  /**
   * Indicates whether to hide the `colorSelection` within the snapping grid controls.
   *
   * @default false
   * @since 5.1
   */
  accessor hideSnappingControlsElementsGridControlsElementsColorSelection: boolean;
  /**
   * Indicates whether to hide the `dynamicScaleToggle` within the snapping grid controls.
   *
   * @default false
   * @since 5.1
   */
  accessor hideSnappingControlsElementsGridControlsElementsDynamicScaleToggle: boolean;
  /**
   * Indicates whether to hide the `lineIntervalInput` within the snapping grid controls.
   *
   * @default false
   * @since 5.1
   */
  accessor hideSnappingControlsElementsGridControlsElementsLineIntervalInput: boolean;
  /**
   * Indicates whether to hide the `numericInputs` within the snapping grid controls.
   *
   * @default false
   * @since 5.1
   */
  accessor hideSnappingControlsElementsGridControlsElementsNumericInputs: boolean;
  /**
   * Indicates whether to hide the `outOfScaleWarning` within the snapping grid controls.
   *
   * @default false
   * @since 5.1
   */
  accessor hideSnappingControlsElementsGridControlsElementsOutOfScaleWarning: boolean;
  /**
   * Indicates whether to hide the `placementButtons` within the snapping grid controls.
   *
   * @default false
   * @since 5.1
   */
  accessor hideSnappingControlsElementsGridControlsElementsPlacementButtons: boolean;
  /**
   * Indicates whether to hide the `rotateWithMapToggle` within the snapping grid controls.
   *
   * @default false
   * @since 5.1
   */
  accessor hideSnappingControlsElementsGridControlsElementsRotateWithMapToggle: boolean;
  /**
   * Indicates whether to hide the `gridEnabledToggle` (snap-to-grid).
   *
   * @default false
   * @since 5.1
   */
  accessor hideSnappingControlsElementsGridEnabledToggle: boolean;
  /**
   * Indicates whether to hide the [FeatureSnappingLayerSource](https://developers.arcgis.com/javascript/latest/references/core/views/interactive/snapping/FeatureSnappingLayerSource/) layerList. The layerlist provides the available layer sources supported for snapping.
   *
   * @default false
   * @since 5.0
   */
  accessor hideSnappingControlsElementsLayerList: boolean;
  /**
   * Indicates whether to hide the `selfEnabledToggle` (Geometry guides). This toggles
   * the [SnappingOptions#selfEnabled](https://developers.arcgis.com/javascript/latest/references/core/views/interactive/snapping/SnappingOptions/#selfEnabled) property.
   *
   * @default false
   * @since 5.0
   */
  accessor hideSnappingControlsElementsSelfEnabledToggle: boolean;
  /**
   * Indicates whether to hide the "Split" button in contexts where that command is available. Default value is `true`.
   *
   * @default false
   * @since 5.0
   */
  accessor hideSplitButton: boolean;
  /**
   * Indicates whether to hide the tooltips toggle. Default value is `true`.
   *
   * @default false
   * @since 5.0
   */
  accessor hideTooltipsToggle: boolean;
  /**
   * Indicates whether to hide undo/redo buttons in the embedded Sketch toolbar. Default value is `true`.
   *
   * @default false
   * @since 5.0
   */
  accessor hideUndoRedoButtons: boolean;
  /**
   * Indicates whether to hide the "Zoom to" button when creating and editing features. Default value is `true`.
   *
   * @default false
   * @since 5.0
   */
  accessor hideZoomToButton: boolean;
  /**
   * Icon which represents the component.
   * Typically used when the component is controlled by another component (e.g. by the Expand component).
   *
   * @default "pencil"
   * @since 4.27
   * @see [Calcite Icons](https://developers.arcgis.com/calcite-design-system/icons/)
   */
  get icon(): Icon["icon"];
  set icon(value: IconName);
  /**
   * The component's default label.
   *
   * @since 4.11
   */
  accessor label: string;
  /**
   * Options to configure the sketch labels shown next to each segment of the geometry being created or updated.
   *
   * > [!WARNING]
   * >
   * > **Known Limitation**
   * >
   * > Sketch labels are currently only supported when working with a [SceneView](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/).
   *
   * @since 4.24
   */
  accessor labelOptions: SketchLabelOptions;
  /**
   * An array of editing configurations for individual layers. It is possible to iterate through the map's [Map#editableLayers](https://developers.arcgis.com/javascript/latest/references/core/Map/#editableLayers) and configure these individual layers as needed.
   *
   * If you have an editable feature layer but do not want
   * the end user to do any type of editing, you can limit this by
   * setting the `enabled` property to `false`.
   *
   * @see [Sample - Editor widget with configurations](https://developers.arcgis.com/javascript/latest/sample-code/widgets-editor-configurable/)
   * @see [Map#editableLayers](https://developers.arcgis.com/javascript/latest/references/core/Map/#editableLayers)
   * @example
   * const editor = new Editor({
   *   view: view,
   *   layerInfos: [{
   *     layer: featureLayer, // pass in the feature layer,
   *     formTemplate:  { // autocastable to FormTemplate
   *       elements: [
   *         { // autocastable to FieldElement
   *           type: "field",
   *           fieldName: "fulladdr",
   *           label: "Full Address"
   *         }
   *       ]
   *     },
   *     enabled: true, // Default is true, set to false to disable editing functionality.
   *     addEnabled: true, // Default is true, set to false to disable the ability to add a new feature.
   *     updateEnabled: false, // Default is true, set to false to disable the ability to edit an existing feature.
   *     deleteEnabled: false, // Default is true, set to false to disable the ability to delete features.
   *     attributeUpdatesEnabled: true, // Default is true, set to false to disable the ability to edit attributes in the update workflow.
   *     geometryUpdatesEnabled: true, // Default is true, set to false to disable the ability to edit feature geometries in the update workflow.
   *     attachmentsOnCreateEnabled: true, //Default is true, set to false to disable the ability to work with attachments while creating features.
   *     attachmentsOnUpdateEnabled: true //Default is true, set to false to disable the ability to work with attachments while updating/deleting features.
   *   }]
   * });
   */
  accessor layerInfos: Array<LayerInfo> | null | undefined;
  /**
   * By assigning the `id` attribute of the Map or Scene component to this property, you can position a child component anywhere in the DOM while still maintaining a connection to the Map or Scene.
   *
   * @see [Associate components with a Map or Scene component](https://developers.arcgis.com/javascript/latest/programming-patterns/#associate-components-with-a-map-or-scene-component)
   */
  accessor referenceElement: ArcgisReferenceElement | string | undefined;
  /**
   * Use this property to supply a custom [SelectionManager](https://developers.arcgis.com/javascript/latest/references/core/views/SelectionManager/) that overrides the default selection manager.
   * This is useful when applications want to share selection sets between components, without relying on the view's selection manager. This property is ignored if [syncViewSelection](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-editor/#syncViewSelection) is `true`.
   *
   * @since 5.0
   * @beta
   */
  accessor selectionManager: SelectionManager | null | undefined;
  /**
   * Indicates whether to display the header. Default is `false`.
   *
   * @default false
   * @since 5.0
   */
  accessor showSnappingControlsElementsHeader: boolean;
  /**
   * The [SnappingOptions](https://developers.arcgis.com/javascript/latest/references/core/views/interactive/snapping/SnappingOptions/) for editing. Supports self snapping and feature snapping. Starting with version 4.23, the [SnappingControls](https://developers.arcgis.com/javascript/latest/references/core/widgets/support/SnappingControls/) UI is automatically integrated into the Editor component.
   * Modify the `snappingOptions` if modifications are needed from what is provided in the default UI.
   *
   * @since 4.19
   * @see [Sample - Editor widget with configurations](https://developers.arcgis.com/javascript/latest/sample-code/widgets-editor-configurable/)
   * @example
   * // Creates the Editor with SnappingOptions with no snapping UI
   * const editor = new Editor({
   *   view: view,
   *   snappingOptions: { // autocasts to SnappingOptions()
   *     enabled: true,
   *     featureSources: [{layer: streetsLayer}] // autocasts to FeatureSnappingLayerSource()
   *   }
   * });
   *
   * // Add the component to the view component
   * <arcgis-map>
   *  <arcgis-editor slot="top-right"></arcgis-editor>
   * </arcgis-map>
   */
  accessor snappingOptions: SnappingOptions;
  /** The current state of the component. */
  get state(): State;
  /**
   * This property allows customization of supporting Editor components and their default behavior.
   * These components include [FeatureForm](https://developers.arcgis.com/javascript/latest/references/core/widgets/FeatureForm/), [FeatureTemplates](https://developers.arcgis.com/javascript/latest/references/core/widgets/FeatureTemplates/), and the
   * [SketchViewModel](https://developers.arcgis.com/javascript/latest/references/core/widgets/Sketch/SketchViewModel/).
   *
   * > [!WARNING]
   * >
   * > This property is useful for basic overrides of the default components. There may be some limitations
   * > to what the Editor can do with these overridden properties. For example, the Editor will disable the `multipleSelectionEnabled` property in [Sketch#defaultUpdateOptions](https://developers.arcgis.com/javascript/latest/references/core/widgets/Sketch/#defaultUpdateOptions)
   * > no matter what is set within this property.
   *
   * @see [Sample - Editor component with configurations](https://developers.arcgis.com/javascript/latest/sample-code/widgets-editor-configurable/)
   * @see [Sample - Editing with calculated field expressions](https://developers.arcgis.com/javascript/latest/sample-code/widgets-featureform-async/)
   */
  accessor supportingWidgetDefaults: SupportingWidgetDefaults | null | undefined;
  /**
   * Controls whether the editor should sync with the view's selection manager.
   * This does not include selection sources, which must be configured independently
   * on the view's selection manager.
   *
   * @default false
   * @since 5.0
   * @beta
   */
  accessor syncViewSelection: boolean;
  /**
   * Options to configure the tooltip shown next to the cursor when creating or updating graphics.
   *
   * @since 4.24
   */
  accessor tooltipOptions: SketchTooltipOptions;
  /**
   * Starting at version 5.0, `arcgis-editor` is transitioning to a next generation geometry
   * creation experience. This new experience provides advanced curve creation tools
   * and allows multiple tools to be used in combination to define a single geometry.
   *
   * As of 5.0, this experience is only available in 2D (e.g. [`arcgis-map`](https://developers.arcgis.com/javascript/latest/references/map-components/arcgis-map)).
   *
   * This property is available to allow 2D applications to temporarily
   * opt out of this experience.
   *
   * > [!CAUTION]
   * >
   * > This option will be removed in an upcoming release.
   *
   * @deprecated
   * @default false
   * @since 5.0
   */
  accessor useLegacyCreateTools: boolean;
  /**
   * The view associated with the component. 
   *   > **Note:** The recommended approach is to fully migrate applications to use map and scene components and avoid using MapView and SceneView directly. However, if you are migrating a large application from widgets to components, you might prefer a more gradual transition. To support this use case, the SDK includes this `view` property which connects a component to a MapView or SceneView. Ultimately, once migration is complete, the arcgis-editor component will be associated with a map or scene component rather than using the `view` property.
   */
  accessor view: MapViewOrSceneView | null | undefined;
  /**
   * Cancels any active selection operation.
   *
   * @since 5.0
   */
  cancelSelectionTool(): void;
  cancelWorkflow(): Promise<void>;
  deleteFeatureFromWorkflow(): Promise<void>;
  /** Permanently destroy the component. */
  destroy(): Promise<void>;
  /** @param info */
  startCreateFeaturesWorkflowAtFeatureCreation(info: CreateFeaturesCreationInfo): Promise<void>;
  startCreateFeaturesWorkflowAtFeatureTypeSelection(): Promise<void>;
  /**
   * Starts a [MergeFeaturesWorkflow](https://developers.arcgis.com/javascript/latest/references/core/widgets/Editor/MergeFeaturesWorkflow/) using
   * the provided features. All features must belong to the same layer.
   *
   * @param features - The features to be merged. These can be supplied
   * either as an array of [Graphic](https://developers.arcgis.com/javascript/latest/references/core/Graphic/) instances or as a single
   * [FeatureInfo](https://developers.arcgis.com/javascript/latest/references/core/widgets/Editor/types/#FeatureInfo) object specifying a layer
   * and the object IDs of the features.
   * @param options - Options for the merge features workflow.
   * @returns Resolves once the workflow has been initialized and is active.
   * @since 5.0
   */
  startMergeFeaturesWorkflow(features: FeatureInfo | Graphic[], options: EditorStartMergeFeaturesWorkflowOptions): Promise<void>;
  /**
   * Starts a [SplitFeatureWorkflow](https://developers.arcgis.com/javascript/latest/references/core/widgets/Editor/SplitFeatureWorkflow/) using the provided feature.
   *
   * @param feature - The feature to be split.
   * @param options - Options for the split feature workflow.
   * @returns Resolves once the workflow has been initialized and is active.
   * @since 5.0
   */
  startSplitFeatureWorkflow(feature: Graphic, options: EditorStartSplitFeatureWorkflowOptions): Promise<void>;
  /**
   * Starts an [UpdateFeaturesWorkflow](https://developers.arcgis.com/javascript/latest/references/core/widgets/Editor/UpdateFeaturesWorkflow/) using
   * the provided features.
   *
   * @param features - The features to be updated. These can be supplied
   * either as an array of [Graphic](https://developers.arcgis.com/javascript/latest/references/core/Graphic/) instances or as a single
   * [FeatureInfo](https://developers.arcgis.com/javascript/latest/references/core/widgets/Editor/types/#FeatureInfo) object specifying a layer
   * and the object IDs of the features.
   * @returns Resolves once the workflow has been initialized and is active.
   * @since 5.0
   */
  startUpdateFeaturesWorkflow(features: FeatureInfo | Graphic[]): Promise<void>;
  /** @param feature */
  startUpdateWorkflowAtFeatureEdit(feature: Graphic): Promise<void>;
  startUpdateWorkflowAtFeatureSelection(): Promise<void>;
  /** @param candidates */
  startUpdateWorkflowAtMultipleFeatureSelection(candidates: Graphic[]): Promise<void>;
  "@setterTypes": {
    icon?: IconName;
  };
  /** Emitted when the value of a property is changed. Use this to listen to changes to properties. */
  readonly arcgisPropertyChange: import("@arcgis/lumina").TargetedEvent<this, { name: "activeWorkflow" | "state"; }>;
  /** Emitted when the component associated with a map or scene view is ready to be interacted with. */
  readonly arcgisReady: import("@arcgis/lumina").TargetedEvent<this, void>;
  /**
   * Fires when a user starts drawing a feature, is actively drawing a feature, and completes drawing a feature.
   *
   * @since 4.34
   */
  readonly arcgisSketchCreate: import("@arcgis/lumina").TargetedEvent<this, EditorSketchCreateEvent>;
  /**
   * Fires when a user starts updating a feature's geometry, is actively updating a feature's geometry, and completes updating a feature's geometry.
   *
   * @since 4.34
   */
  readonly arcgisSketchUpdate: import("@arcgis/lumina").TargetedEvent<this, EditorSketchUpdateEvent>;
  readonly "@eventTypes": {
    arcgisPropertyChange: ArcgisEditor["arcgisPropertyChange"]["detail"];
    arcgisReady: ArcgisEditor["arcgisReady"]["detail"];
    arcgisSketchCreate: ArcgisEditor["arcgisSketchCreate"]["detail"];
    arcgisSketchUpdate: ArcgisEditor["arcgisSketchUpdate"]["detail"];
  };
}