import type FormTemplate from "../../../form/FormTemplate.js";
import type EditingCapabilities from "../../../layers/support/EditingCapabilities.js";
import type { EditingCapabilitiesProperties } from "../../../layers/support/EditingCapabilities.js";
import type { AttachmentCapabilities, CreateCapabilities, DeleteCapabilities, RelationshipCapabilities, UpdateCapabilities } from "../../../layers/support/types.js";
import type { LayerInfo } from "../types.js";

export interface EditorEditingCapabilitiesProperties extends EditingCapabilitiesProperties, Partial<Pick<EditorEditingCapabilities, "layerInfo">> {}

/** The current editing capabilities for the provided layer and read by the [Editor](https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-Editor.html). This takes into account what is set on the [EditorItem#layerInfo](https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-Editor-support-EditorItem.html#layerInfo) */
export default abstract class EditorEditingCapabilities extends EditingCapabilities {
  /** Specific permissions for attachment operations. It takes into account the [Editor's layerInfo](https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-Editor-types.html#LayerInfo) settings. */
  get attachments(): AttachmentCapabilities;
  /** Specific permissions for create operations. It takes into account the [Editor's layerInfo](https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-Editor-types.html#LayerInfo) settings. */
  get create(): CreateCapabilities;
  /** The default editing capabilities for the provided layer. This does not take into account what may be set on the [EditorItem#layerInfo](https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-Editor-support-EditorItem.html#layerInfo) settings. */
  get defaults(): EditingCapabilities;
  /** Specific permissions for delete operations. It takes into account the [Editor's layerInfo](https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-Editor-types.html#LayerInfo) settings. */
  get delete(): DeleteCapabilities;
  /** The primary form template in use. It takes into account the Editor's [layerInfos](https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-Editor-types.html#LayerInfo) and whether a form template is set on a `layerInfo` within it. If so, the form template set on a [LayerInfo](https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-Editor-types.html#LayerInfo) within the Editor takes precedence over a form template set directly on a [FeatureLayer](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-FeatureLayer.html) or [SubtypeSublayer](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-support-SubtypeSublayer.html). A form template set within the [Editor](https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-Editor.html) widget's [layerInfos](https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-Editor-types.html#LayerInfo) takes priority over a form template set directly on a [FeatureLayer](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-FeatureLayer.html) or [SubtypeSublayer](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-support-SubtypeSublayer.html). */
  get formTemplate(): FormTemplate | null | undefined;
  /** The layer's associated [LayerInfo](https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-Editor-types.html#LayerInfo) . */
  accessor layerInfo: LayerInfo | null | undefined;
  /** Indicates if the layer contains at least one relationship in addition to child [Workflow](https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-Editor-Workflow.html) permissions. It takes into account what is set on the [EditorItem#layerInfo](https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-Editor-support-EditorItem.html#layerInfo). It does not take into account whether a parent or related layer has the ability to edit. A collection of all [EditorItems](https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-Editor-support-EditorItem.html) that represent potential related layers should be referenced if accessing editing permissions per related layer. */
  get relationship(): RelationshipCapabilities;
  /** Specific permissions for update operations. It takes into account the [Editor's layerInfo](https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-Editor-types.html#LayerInfo) settings. */
  get update(): UpdateCapabilities;
}