/**
 * Media layer utilities for the map viewer application.
 *
 * @internal
 * @internal
 */
import type Extent from "../../geometry/Extent.js";
import type ControlPointsGeoreference from "../../layers/support/ControlPointsGeoreference.js";
import type MapView from "../../views/MapView.js";
import type { MediaElement } from "../../layers/media/types.js";

/**
 * Creates a georeference for a media element and a view extent.
 *
 * @param mediaElement - The media element to create the georeference for.
 * @param extent - The view extent in which fits the georeference.
 * @returns The georeference fitting in the view extent.
 * @internal
 * @internal
 */
export function createDefaultControlPointsGeoreference(mediaElement: MediaElement, extent: Extent): Promise<ControlPointsGeoreference>;

/**
 * Creates a georeference to be used in a MapView when authoring the source points of the element's georeference.
 * The resulting georeference has each map point x/y coordinates, pointing to the same pixel coordinates of each corresponding source point.
 *
 * @param mediaElement - The media element to create the georeference for.
 * @returns A georeference with map points in pixels.
 * @internal
 * @internal
 */
export function createLocalModeControlPointsGeoreference(mediaElement: MediaElement): ControlPointsGeoreference | null | undefined;

/**
 * Creates a media transform tools wrapper for a media element.
 *
 * @param properties - Properties
 * @returns A MediaTransformToolsWrapper instance or nil.
 * @internal
 * @internal
 */
export function createMediaTransformToolsWrapper(properties: MediaTransformToolsWrapperProperties): any | null | undefined;

/**
 * MediaTransformToolsWrapperConstructProperties
 *
 * @internal
 * @internal
 */
export interface MediaTransformToolsWrapperProperties {
  /**
   * The MapView instance
   *
   * @internal
   */
  view: MapView;
  /**
   * The ImageElement or VideoElement
   *
   * @internal
   */
  mediaElement: MediaElement;
  /**
   * Whether or not to preserve the aspect ration
   *
   * @internal
   */
  preserveAspectRatio?: boolean | null;
  /**
   * Should snapping be enabled for rotation?
   *
   * @internal
   */
  snapRotation?: boolean | null;
  /**
   * The advanced mode view and media element
   *
   * @internal
   */
  advancedMode: AdvancedMediaTransformToolsWrapperProperties;
}

/**
 * AdvancedMediaTransformToolsWrapperConstructProperties
 *
 * @internal
 * @internal
 */
export interface AdvancedMediaTransformToolsWrapperProperties {
  /**
   * The advanced mode MapView instance
   *
   * @internal
   */
  view: MapView;
  /**
   * The advanced mode ImageElement or VideoElement
   *
   * @internal
   */
  mediaElement: MediaElement;
}