export interface RefreshableLayerProperties extends Partial<Pick<RefreshableLayer, "refreshInterval">> {}

export interface RefreshEvent {
  /** Indicates if the layer's data has changed. */
  dataChanged?: boolean;
}

export interface RefreshableLayerEvents {
  /**
   * Fires if the layer has the [refreshInterval](https://developers.arcgis.com/javascript/latest/references/core/layers/mixins/RefreshableLayer/#refreshInterval) set or when [refresh()](https://developers.arcgis.com/javascript/latest/references/core/layers/mixins/RefreshableLayer/#refresh) method is called.
   * The event payload indicates if the layer's data has changed.
   *
   * @since 4.21
   * @see [refreshInterval](https://developers.arcgis.com/javascript/latest/references/core/layers/mixins/RefreshableLayer/#refreshInterval)
   * @see [refresh()](https://developers.arcgis.com/javascript/latest/references/core/layers/mixins/RefreshableLayer/#refresh)
   * @see [Sample - GeoJSONLayer with dynamic URL](https://developers.arcgis.com/javascript/latest/sample-code/layers-geojson-refresh/)
   * @example
   * // listen to layer's refresh event to fetch the attachments
   * // for the updated features.
   * layer.on("refresh", async (event) =>{
   *   if (!event.dataChanged){
   *     return;
   *   }
   *
   *   try {
   *     const query = layer.createQuery();
   *     const objectIds = await layer.queryObjectIds(query);
   *     let attachmentQuery = {
   *       objectIds: objectIds,
   *       definitionExpression: layer.definitionExpression,
   *       attachmentTypes: ["image/jpeg"]
   *     };
   *
   *     const attachments = await layer.queryAttachments(attachmentQuery);
   *
   *     attachmentQuery.objectIds.forEach(function (objectId) {
   *       if (attachments[objectId]) {
   *         // process the updated attachments
   *         let attachment = attachments[objectId];
   *         console.log("Attachments for objectId ", objectId, attachment);
   *       }
   *     });
   *   } catch (error) {
   *     console.log("attachment query error", error);
   *   }
   * });
   * @example
   * // listen to layer's refresh event to fetch object ids of completed features
   * layer.on("refresh", function(event){
   *   if (event.dataChanged){
   *     const query = layer.createQuery();
   *     query.where = "Status = 'Completed'";
   *     layer.queryObjectIds(query).then((objectIds) => {
   *      // process returned features
   *     });
   *   }
   * });
   */
  refresh: RefreshEvent;
}

/**
 * Mixin for layers that support refresh and refreshInterval.
 *
 * @since 4.6
 */
export abstract class RefreshableLayer {
  constructor(...args: any[]);
  /**
   * @deprecated
   * Do not directly reference this property.
   * Use EventNames and EventTypes helpers from \@arcgis/core/Evented
   */
  "@eventTypes": RefreshableLayerEvents;
  /**
   * Refresh interval of the layer in minutes. Value of `0` indicates no refresh.
   *
   * @default 0
   * @since 4.6
   * @see [RefreshableLayer.refresh()](https://developers.arcgis.com/javascript/latest/references/core/layers/mixins/RefreshableLayer/#refresh)
   * @see [refresh event](https://developers.arcgis.com/javascript/latest/references/core/layers/mixins/RefreshableLayer/#event-refresh)
   * @example
   * // the layer will be refreshed every minute.
   * layer.refreshInterval = 1;
   */
  accessor refreshInterval: number;
  /**
   * Fetches all the data for the layer.
   *
   * @since 4.6
   * @see [RefreshableLayer.refreshInterval](https://developers.arcgis.com/javascript/latest/references/core/layers/mixins/RefreshableLayer/#refreshInterval)
   * @see [refresh event](https://developers.arcgis.com/javascript/latest/references/core/layers/mixins/RefreshableLayer/#event-refresh)
   */
  refresh(): void;
}