import type Graphic from "../../Graphic.js";
import type MapView from "../../views/MapView.js";

/**
 * @internal
 * @internal
 */
export interface GraphicMover {
  /**
   * Destroys the graphics mover, and releases resources.
   *
   * @internal
   */
  destroy: () => void;
}

/**
 * @internal
 * @internal
 */
export interface GraphicMoverCallbacks {
  /**
   * Callback for `"graphic-pointer-over"` event.
   *
   * @internal
   */
  onGraphicPointerOver: () => void;
  /**
   * Callback for `"graphic-pointer-out"` event.
   *
   * @internal
   */
  onGraphicPointerOut: () => void;
  /**
   * Callback for `"graphic-move-stop"` event.
   *
   * @internal
   */
  onGraphicMoveStop: () => Promise<void>;
}

/**
 * @internal
 * @internal
 */
export interface GraphicMoverProperties {
  /**
   * The view on which to move graphics
   *
   * @internal
   */
  view: MapView;
  /**
   * The graphics to move
   *
   * @internal
   */
  graphics: Graphic[];
  /**
   * Flag whether indicators are enabled
   *
   * @internal
   */
  indicatorsEnabled: boolean;
  /**
   * Flag whether highlights are enabled
   *
   * @internal
   */
  highlightsEnabled: boolean;
  /**
   * Flag to decide if all graphics should be moved
   *
   * @internal
   */
  enableMoveAllGraphics: boolean;
  /**
   * Set of callbacks which can be used to respond to graphic move events
   *
   * @internal
   */
  callbacks: GraphicMoverCallbacks;
}

/**
 * creates a graphics mover to move several graphics on a Graphics layer all at once.
 *
 * @param props
 * @internal
 * @internal
 */
export function createGraphicsMover(props: GraphicMoverProperties): GraphicMover;