import type Collection from "../../core/Collection.js";
import type CatalogLayer from "../../layers/CatalogLayer.js";
import type ListItem from "../LayerList/ListItem.js";
import type { EventedAccessor } from "../../core/Evented.js";
import type { MapViewOrSceneView } from "../../views/MapViewOrSceneView.js";
import type { CatalogLayerListState } from "./types.js";
import type { LayerListViewModelEvents } from "../LayerList/LayerListViewModel.js";
import type { Action, ListItemModifier } from "../LayerList/types.js";

export interface CatalogLayerListViewModelProperties extends Partial<Pick<CatalogLayerListViewModel, "catalogLayer" | "checkPublishStatusEnabled" | "listItemCreatedFunction" | "listModeDisabled" | "view">> {}

export interface CatalogLayerListViewModelEvents extends LayerListViewModelEvents {}

/**
 * Provides the logic for the [CatalogLayerList](https://developers.arcgis.com/javascript/latest/references/core/widgets/CatalogLayerList/) widget and [component](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-catalog-layer-list/).
 *
 * @since 4.30
 * @see [CatalogLayerList](https://developers.arcgis.com/javascript/latest/references/core/widgets/CatalogLayerList/) widget
 * @see [Catalog Layer List component](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-catalog-layer-list/)
 */
export default class CatalogLayerListViewModel extends EventedAccessor {
  /**
   * @deprecated
   * Do not directly reference this property.
   * Use EventNames and EventTypes helpers from \@arcgis/core/Evented
   */
  "@eventTypes": CatalogLayerListViewModelEvents;
  constructor(properties?: CatalogLayerListViewModelProperties);
  /**
   * The collection of [ListItems](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/ListItem/) representing the [catalogLayer's](https://developers.arcgis.com/javascript/latest/references/core/widgets/CatalogLayerList/CatalogLayerListViewModel/#catalogLayer)
   * [CatalogLayer.dynamicGroupLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/CatalogLayer/#dynamicGroupLayer).
   *
   * @see [CatalogLayerList.selectedItems](https://developers.arcgis.com/javascript/latest/references/core/widgets/CatalogLayerList/#selectedItems)
   */
  get catalogItems(): Collection<ListItem>;
  /**
   * The [CatalogLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/CatalogLayer/) to display in the widget.
   *
   * @example catalogLayerList.catalogLayer = new CatalogLayer({ url });
   */
  accessor catalogLayer: CatalogLayer | null | undefined;
  /**
   * Whether to provide an indication if a layer is being published in the
   * [CatalogLayerList](https://developers.arcgis.com/javascript/latest/references/core/widgets/CatalogLayerList/). When a layer is publishing,
   * a rotating square will appear to the right of the list item title.
   * The list item
   * [ListItem.publishing](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/ListItem/#publishing) property
   * will be `false` if `checkPublishStatusEnabled` is `false`.
   *
   * @default false
   */
  accessor checkPublishStatusEnabled: boolean;
  /**
   * A function that executes each time a [ListItem](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/ListItem/) is created.
   * Use this function to add actions and panels to list items, and to override
   * the default settings of a list item. Actions can be added to list items
   * using the [ListItem.actionsSections](https://developers.arcgis.com/javascript/latest/references/core/widgets/LayerList/ListItem/#actionsSections)
   * property of the ListItem.
   *
   * @example
   * // Create a new CatalogLayerListViewModel with a listItemCreatedFunction
   * // that adds an "add-layer" action to each catalog layer list item
   * const catalogLayerListViewModel = new CatalogLayerListViewModel({
   *  catalogLayer,
   *  listItemCreatedFunction: (event) => {
   *    const { item } = event;
   *    const { layer } = item;
   *
   *    if (isLayerFromCatalog(layer)) {
   *      item.actionsSections = [
   *        [
   *          {
   *            title: "Add layer to map",
   *            icon: "add-layer",
   *            id: "add-layer"
   *          }
   *        ]
   *      ];
   *    }
   *  },
   *  view
   * });
   *
   * // Listen for the trigger-action event on the CatalogLayerListViewModel
   * // and add layers from the catalog to the map when the "add-layer" action is triggered.
   * // To correctly add a layer to the map, you must create a footprint from the layer
   * // and then create a new layer from the footprint.
   * catalogLayerListViewModel.on("trigger-action", async (event) => {
   *   const { id } = event.action;
   *   const { layer } = event.item;
   *
   *   if (id === "add-layer") {
   *     const parentCatalogLayer = catalogUtils.getCatalogLayerForLayer(layer);
   *     const footprint = parentCatalogLayer.createFootprintFromLayer(layer);
   *     const layerFromFootprint = await parentCatalogLayer.createLayerFromFootprint(footprint);
   *     map.add(layerFromFootprint);
   *   }
   * });
   */
  accessor listItemCreatedFunction: ListItemModifier | null | undefined;
  /**
   * Specifies whether to ignore the [Layer.listMode](https://developers.arcgis.com/javascript/latest/references/core/layers/Layer/#listMode) property to display all layers.
   *
   * @default false
   * @since 4.32
   * @see [Layer.listMode](https://developers.arcgis.com/javascript/latest/references/core/layers/Layer/#listMode)
   */
  accessor listModeDisabled: boolean;
  /**
   * The view model's state.
   *
   * @default "disabled"
   */
  get state(): CatalogLayerListState;
  /** The view from which the widget will operate. */
  accessor view: MapViewOrSceneView | null | undefined;
  /**
   * Triggers the [@trigger-action](https://developers.arcgis.com/javascript/latest/references/core/widgets/CatalogLayerList/CatalogLayerListViewModel/#event-trigger-action) event and executes
   * the given [action](https://developers.arcgis.com/javascript/latest/references/core/support/actions/ActionButton/) or [action toggle](https://developers.arcgis.com/javascript/latest/references/core/support/actions/ActionToggle/).
   *
   * @param action - The action to execute.
   * @param item - An item associated with the action.
   */
  triggerAction(action: Action, item: ListItem): void;
}