import type Point from "../geometry/Point.js";
import type OrientedImageryLayer from "../layers/OrientedImageryLayer.js";
import type Widget from "./Widget.js";
import type OrientedImageryViewerViewModel from "./OrientedImageryViewer/OrientedImageryViewerViewModel.js";
import type OrientedImageryViewerVisibleElements from "./OrientedImageryViewer/OrientedImageryViewerVisibleElements.js";
import type { Icon } from "@esri/calcite-components/components/calcite-icon";
import type { AbortOptions } from "../core/promiseUtils.js";
import type { MapViewOrSceneView } from "../views/MapViewOrSceneView.js";
import type { OrientedImageryViewerViewModelEvents } from "./OrientedImageryViewer/types.js";
import type { OrientedImageryViewerVisibleElementsProperties } from "./OrientedImageryViewer/OrientedImageryViewerVisibleElements.js";
import type { WidgetProperties } from "./Widget.js";

export interface OrientedImageryViewerProperties extends WidgetProperties, Partial<Pick<OrientedImageryViewer, "currentCoverageVisible" | "dataCaptureEnabled" | "disabled" | "galleryOpened" | "imageEnhancementToolActive" | "imageOverlaysOpened" | "isAdditionalCoverageVisible" | "isAdditionalPointSourcesVisible" | "layer" | "mapImageConversionToolState" | "navigationToolActive" | "preloadMedia" | "view">> {
  /**
   * Icon displayed in the widget's button.
   *
   * @default "oriented-imagery-widget"
   * @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 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 5.1
   * @example
   * orientedImageryViewer.visibleElements = {
   *   menu: true,
   *   header: false,
   * }
   */
  visibleElements?: OrientedImageryViewerVisibleElementsProperties;
}

/** @since 5.1 */
export interface OrientedImageryViewerEvents extends OrientedImageryViewerViewModelEvents {}

/**
 * The oriented imagery viewer widget allows the user to explore and use their oriented images. Click on a map to view the best image in your collection that depicts a clicked
 * location. To see an image better, the user can view assets from multiple directions, and enhance contrast, brightness and sharpening.
 * As the user pans and zooms in an image, the widget will update the camera's field of view on the map (and show how it relates to any vector data in the map).
 * The oriented imagery viewer supports JPG, JPEG, TIF and MRF image formats.
 *
 * @deprecated since version 5.0. Use the [Oriented Imagery Viewer](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-oriented-imagery-viewer/) component instead. For information on widget deprecation, read about [Esri's move to web components](https://developers.arcgis.com/javascript/latest/components-transition-plan/).
 * @since 4.28
 * @see [OrientedImageryLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/OrientedImageryLayer/)
 * @see [Sample - Intro to OrientedImageryLayer](https://developers.arcgis.com/javascript/latest/sample-code/layers-orientedimagerylayer/)
 * @see [Sample - OrientedImageryLayer in SceneView](https://developers.arcgis.com/javascript/latest/sample-code/layers-orientedimagerylayer-sceneview/)
 */
export default class OrientedImageryViewer extends Widget {
  /** @since 5.1 */
  "@eventTypes": OrientedImageryViewerEvents;
  /**
   * @example
   * // typical usage
   * orientedImageryViewer = new OrientedImageryViewer({
   *   view,
   *   container: "oi-container"
   * });
   */
  constructor(properties?: OrientedImageryViewerProperties);
  /**
   * Toggles the visibility of the current footprint polygon associated with the selected image loaded in the viewer.
   * Current footprint coverage allows you to better understand how the images in the oriented imagery layer relate to the map.
   * The footprint of the image is symbolized with red fill on the map. If you zoom or pan in the oriented imagery viewer,
   * the footprint coverage graphic will update on the map to highlight the area on the map that is visible in the image.
   *
   * @default true
   */
  accessor currentCoverageVisible: boolean;
  /**
   * Indicates whether the data capture tools are enabled in the oriented imagery viewer for digitization.
   * When set to `true` , the data capture (edit) option will be visible on the digitizable overlayed feature layers available in the image overlays tab.
   * On clicking the data capture option, the digitization tools will appear at the bottom of the viewer once the overlay tab is closed.
   *
   * @default false
   * @since 4.32
   */
  accessor dataCaptureEnabled: boolean;
  /**
   * When `false`, the view click interaction is enabled for the oriented imagery viewer widget. This allows users to pick a location on the map and display the best image to the viewer.
   * When `true` the view click interaction will be defaulted to map navigation.
   *
   * @default false
   */
  accessor disabled: boolean;
  /**
   * Indicates if the image gallery functionality is available in the widget.
   * To visualize additional images of the same location, select the image gallery from the oriented imagery viewer.
   * The galley is a carousel of low-resolution thumbnails of all images that depict the selected map location. Click a thumbnail to view the full-resolution image in the oriented imagery viewer.
   *
   * @default false
   */
  accessor galleryOpened: boolean;
  /**
   * Icon displayed in the widget's button.
   *
   * @default "oriented-imagery-widget"
   * @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 if the image enhancement tool is active. When `true` the widget displays the functionalities to adjust the brightness, contrast, and sharpness of the
   * image in the oriented imagery viewer using interactive sliders.
   * Settings will be preserved for subsequent images loaded in the oriented imagery viewer.
   *
   * @default false
   */
  accessor imageEnhancementToolActive: boolean;
  /**
   * When `true`, the image gallery functionality is available in the widget.
   * Image gallery currently only supports MRF and Tif image formats.
   */
  get imageGalleryEnabled(): boolean;
  /**
   * Indicates whether the image overlays tab in the oriented imagery viewer is open.
   * When set to `true` , the overlays tab appears at the bottom of the viewer. It includes two toggle options: overlay camera locations and overlay map features.
   * These options enable users to visualize and overlay map features that intersect with the image’s footprint within the viewer.
   *
   * @default false
   * @since 4.32
   */
  accessor imageOverlaysOpened: boolean;
  /**
   * Indicates if the additional footprint polygons are visible for the selected image loaded in the viewer.
   * The footprint graphics (appearing in blue) show the coverage footprints of all the additional images in the
   * layer that depict the location selected by the user.
   *
   * @default false
   */
  accessor isAdditionalCoverageVisible: boolean;
  /**
   * Indicates if the additional camera locations are visible for the selected image loaded in the viewer.
   * The point location graphics (appearing in blue) show the camera locations for additional images that depict the location the user selects.
   *
   * @default false
   */
  accessor isAdditionalPointSourcesVisible: boolean;
  /**
   * Specifies the current [OrientedImageryLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/OrientedImageryLayer/) to use. The layer is one the widget connects to and utilizes to populate the image.
   * The layer contains the feature data and oriented imagery properties required by the viewer to load the image and generate the associated graphics.
   */
  accessor layer: OrientedImageryLayer | null | undefined;
  /**
   * Indicates if the map-image location tool is available in the widget.
   * When `true`, the user can select a point on the map and the corresponding location in pixel space will be displayed in the image, and vice versa.
   *
   * @default false
   */
  accessor mapImageConversionToolState: boolean;
  /**
   * When `true`, the navigation tool is available in the widget.
   * The navigation tool can be used to explore the images that contain the selected location on the map using a compass.
   * To view a different image of the selected map location, click the camera locations (blue dots), or click a segment to view
   * the best image from that segment (segments with images are shown in white; segments without images are gray).
   *
   * @default false
   */
  accessor navigationToolActive: boolean;
  /**
   * When true, loading an image via directional or sequential navigation caches all neighboring images associated with that image.
   * Navigating to adjacent images then uses the cached assets, reducing load times and improving viewer performance.
   *
   * @default false
   * @since 5.0
   */
  accessor preloadMedia: boolean;
  /**
   * This property provides the location of an image pixel in Map coordinates when using map-image conversion tool.
   *
   * @since 4.29
   */
  get referencePoint(): Point | null;
  /**
   * A reference to the [MapView](https://developers.arcgis.com/javascript/latest/references/core/views/MapView/) or [SceneView](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/).
   * Set this to link the widget to a specific view.
   *
   * @since 4.30
   */
  accessor view: MapViewOrSceneView | null | undefined;
  /**
   * 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
   * [OrientedImageryViewerViewModel](https://developers.arcgis.com/javascript/latest/references/core/widgets/OrientedImageryViewer/OrientedImageryViewerViewModel/) class to access
   * all properties and methods on the widget.
   */
  get viewModel(): OrientedImageryViewerViewModel;
  /**
   * 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 5.1
   * @example
   * orientedImageryViewer.visibleElements = {
   *   menu: true,
   *   header: false,
   * }
   */
  get visibleElements(): OrientedImageryViewerVisibleElements;
  set visibleElements(value: OrientedImageryViewerVisibleElementsProperties);
  /**
   * Loads the best available image for a given map point and displays it in the viewer. The method takes a `Point` object as an argument, which represents the location on the map for which the best image should be loaded. The viewer will analyze the available images for that location and select the one that best matches the given location.
   *
   * @param mapPoint - The [Point](https://developers.arcgis.com/javascript/latest/references/core/geometry/Point/) object representing the location on the map for which to load the best image.
   * @param options - Optional parameters for aborting the image loading process. This can be used to cancel the operation if it takes too long or if the user navigates away from the location before the image is loaded.
   * @since 5.1
   */
  loadBestImage(mapPoint: Point, options?: AbortOptions): Promise<void>;
  /**
   * Resets the viewer to its initial state.
   * This method clears the currently displayed image or video from the viewer and removes all associated graphics from the map.
   *
   * @since 4.34
   */
  reset(): void;
}