import type Graphic from "../Graphic.js";
import type EsriError from "../core/Error.js";
import type Widget from "./Widget.js";
import type AttachmentsViewModel from "./Attachments/AttachmentsViewModel.js";
import type { Icon } from "@esri/calcite-components/components/calcite-icon";
import type { WidgetProperties } from "./Widget.js";
import type { AttachmentsCapabilities, AttachmentsDisplay } from "./Attachments/types.js";
import type { GraphicProperties } from "../Graphic.js";
import type { AttachmentsViewModelProperties } from "./Attachments/AttachmentsViewModel.js";

export interface AttachmentsProperties extends WidgetProperties, Partial<Pick<Attachments, "attachmentKeywords" | "attachmentTypes" | "displayType" | "visibleElements">> {
  /**
   * The capabilities needed for the attachments widget.
   *
   * @since 4.27
   */
  capabilities?: Partial<AttachmentsCapabilities>;
  /** The graphic for the attachments. */
  graphic?: GraphicProperties | null;
  /**
   * Icon which represents the widget. It is typically used when the widget is controlled by another
   * one (e.g. in the Expand widget).
   *
   * @default "attachment"
   * @since 4.27
   * @see [Calcite Icon Search](https://developers.arcgis.com/calcite-design-system/icons/)
   * @see [Calcite Icon Search](https://developers.arcgis.com/calcite-design-system/icons/)
   */
  icon?: Icon["icon"] | null;
  /**
   * The view model for this widget. This is a class that contains all the logic
   * (properties and methods) that controls this widget's behavior. See the
   * [AttachmentsViewModel](https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-Attachments-AttachmentsViewModel.html) class to access
   * all properties and methods on the widget.
   */
  viewModel?: AttachmentsViewModelProperties;
}

/**
 * The visible elements that are displayed within the widget.
 * This provides the ability to turn individual elements of the widget's display on/off.
 */
export interface VisibleElements {
  /** Indicates whether to display the `Add` button which prompts the dialog to add a new attachment. Default is `true`. */
  addButton?: boolean;
  /** Indicates whether to display the `add` button after selecting the attachment to add. Default value is `true`. */
  addSubmitButton?: boolean;
  /** Indicates whether to display the `cancel` button after selecting the attachment to add. Default value is `true`. */
  cancelAddButton?: boolean;
  /** Indicates whether to display the `cancel` button after selecting an attachment to update an existing attachment. Default value is `true`. */
  cancelUpdateButton?: boolean;
  /** Indicates whether to display the `delete` button to delete an existing attachment. Default value is `true`. */
  deleteButton?: boolean;
  /** Indicates whether to display an error message if adding or updating an attachment results in errors. Default value is `true`. */
  errorMessage?: boolean;
  /** Indicates whether to display a progress bar when adding an attachment. Default value is `true`. */
  progressBar?: boolean;
  /** Indicates whether to display an `update` button to allow updating on existing attachments. Default value is `true`. */
  updateButton?: boolean;
}

/**
 * This widget allows users to view and edit attachments associated with a feature and is
 * considered a standalone experience that can be utilized in widgets such [Popup](https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-Popup.html) and [Editor](https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-Editor.html).
 * When viewing attachments, the attachment's thumbnail, file format, and size are
 * displayed. The [Popup](https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-Popup.html) widget uses this widget's
 * functionality to display attachments. Whereas the [Editor](https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-Editor.html)
 * widget has the functionality to edit attachments automatically configured within it.
 *
 * If the associated feature layer(s) contains an `attachment` [capability](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-FeatureLayer.html#capabilities),
 * the widget will recognize it as such. And based on the functionality needed, will display the attachment for viewing
 * or editing.
 *
 * If needing to edit attachments, the feature layer must first be enabled for editing. The ability
 * to create, update, and delete attachments will display based on the feature layer's editing permissions.
 *
 * > [!WARNING]
 * >
 * > **Known Limitations**
 * > Editing attachments is currently available using the [Editor](https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-Editor.html) widget.
 *
 * The following image displays the various displays of the attachment widget.
 * ![attachments](https://developers.arcgis.com/javascript/latest/assets/img/apiref/widgets/attachments-merged.png)
 *
 * @since 4.15
 * @see [Sample - Popup with edit action](https://developers.arcgis.com/javascript/latest/sample-code/popup-editaction/)
 * @see [AttachmentsViewModel](https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-Attachments-AttachmentsViewModel.html)
 * @see [Editor](https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-Editor.html)
 * @see [Popup](https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-Popup.html)
 * @see [PopupTemplate](https://developers.arcgis.com/javascript/latest/api-reference/esri-PopupTemplate.html)
 * @see [AttachmentsContent](https://developers.arcgis.com/javascript/latest/api-reference/esri-popup-content-AttachmentsContent.html)
 * @see [DefaultUI](https://developers.arcgis.com/javascript/latest/api-reference/esri-views-ui-DefaultUI.html)
 * @see [FeatureLayer](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-FeatureLayer.html)
 * @see [AttachmentInfo](https://developers.arcgis.com/javascript/latest/api-reference/esri-rest-query-support-AttachmentInfo.html)
 * @see [ArcGIS REST API - Attachment Infos (Feature Service)](https://developers.arcgis.com/rest/services-reference/attachment-infos-feature-service-.htm)
 */
export default class Attachments extends Widget {
  constructor(properties?: AttachmentsProperties);
  /** An array of strings used to identify attachment(s). When attachments are displayed, this property is used to query attachments using an exact match on the keywords provided. */
  accessor attachmentKeywords: string[] | null | undefined;
  /** An array of strings representing MIME types. When attachments are displayed, this property is used to query attachments based on MIME type. Valid values: application, audio, image, model, text, and video. */
  accessor attachmentTypes: ("application" | "audio" | "image" | "model" | "text" | "video")[] | null | undefined;
  /**
   * The capabilities needed for the attachments widget.
   *
   * @since 4.27
   */
  get capabilities(): AttachmentsCapabilities;
  set capabilities(value: Partial<AttachmentsCapabilities>);
  /**
   * String indicating how to [display](https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-Attachments.html#displayType) the attachments.
   *
   * | Value    | Description |
   * | ------ | ----------- |
   * | auto     | Default value. If a feature layer's capabilities supports [resizing attachments](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-FeatureLayer.html#capabilities), the popup will display attachments in `preview` mode.|
   * | preview  | Shows a thumbnail image of the attachment.|
   * | list     | Shows a list of attachment links. |
   *
   * @default "auto"
   */
  accessor displayType: AttachmentsDisplay;
  /** Error defined when adding, updating or deleting an attachment fails. */
  get error(): EsriError | null | undefined;
  /** The graphic for the attachments. */
  get graphic(): Graphic | null | undefined;
  set graphic(value: GraphicProperties | null | undefined);
  /**
   * Icon which represents the widget. It is typically used when the widget is controlled by another
   * one (e.g. in the Expand widget).
   *
   * @default "attachment"
   * @since 4.27
   * @see [Calcite Icon Search](https://developers.arcgis.com/calcite-design-system/icons/)
   * @see [Calcite Icon Search](https://developers.arcgis.com/calcite-design-system/icons/)
   */
  get icon(): Icon["icon"];
  set icon(value: Icon["icon"] | null | undefined);
  /**
   * Indicates whether there is currently an attachment being added, updated or deleted.
   *
   * @default false
   * @since 4.27
   */
  get submitting(): boolean;
  /**
   * The view model for this widget. This is a class that contains all the logic
   * (properties and methods) that controls this widget's behavior. See the
   * [AttachmentsViewModel](https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-Attachments-AttachmentsViewModel.html) class to access
   * all properties and methods on the widget.
   */
  get viewModel(): AttachmentsViewModel;
  set viewModel(value: AttachmentsViewModelProperties);
  /**
   * The visible elements that are displayed within the widget.
   * This property provides the ability to turn individual elements of the widget's display on/off.
   *
   * @since 4.27
   */
  accessor visibleElements: VisibleElements;
}