import type Analysis from "../../../analysis/Analysis.js";
import type AreaMeasurementAnalysisView3D from "./AreaMeasurementAnalysisView3D.js";
import type DimensionAnalysisView3D from "./DimensionAnalysisView3D.js";
import type DirectLineMeasurementAnalysisView3D from "./DirectLineMeasurementAnalysisView3D.js";
import type ElevationProfileAnalysisView3D from "./ElevationProfileAnalysisView3D.js";
import type LineOfSightAnalysisView3D from "./LineOfSightAnalysisView3D.js";
import type ShadowCastAnalysisView3D from "./ShadowCastAnalysisView3D.js";
import type SliceAnalysisView3D from "./SliceAnalysisView3D.js";
import type ViewshedAnalysisView3D from "./ViewshedAnalysisView3D.js";
import type VolumeMeasurementAnalysisView3D from "./VolumeMeasurementAnalysisView3D.js";

/**
 * Maps each analysis type identifier to the corresponding 3D analysis view class.
 *
 * @since 5.0
 */
export interface AnalysisView3DMap {
  /** @since 5.0 */
  "area-measurement": AreaMeasurementAnalysisView3D;
  /** @since 5.0 */
  dimension: DimensionAnalysisView3D;
  /** @since 5.0 */
  "direct-line-measurement": DirectLineMeasurementAnalysisView3D;
  /** @since 5.0 */
  "distance-measurement": never;
  /** @since 5.0 */
  "elevation-profile": ElevationProfileAnalysisView3D;
  /** @since 5.0 */
  "line-of-sight": LineOfSightAnalysisView3D;
  /** @since 5.0 */
  "shadow-cast": ShadowCastAnalysisView3D;
  /** @since 5.0 */
  slice: SliceAnalysisView3D;
  /** @since 5.0 */
  viewshed: ViewshedAnalysisView3D;
  /** @since 5.0 */
  "volume-measurement": VolumeMeasurementAnalysisView3D;
}

/**
 * Resolves the 3D analysis view type for a given analysis instance.
 *
 * @since 5.0
 */
export type AnalysisView3DFor<AnalysisType extends Analysis> = AnalysisView3DMap[AnalysisType["type"]];

/**
 * Union of all possible analysis views that can be added to a [SceneView](https://developers.arcgis.com/javascript/latest/api-reference/esri-views-SceneView.html).
 *
 * @since 5.0
 */
export type AnalysisView3DUnion = AreaMeasurementAnalysisView3D | DimensionAnalysisView3D | DirectLineMeasurementAnalysisView3D | ElevationProfileAnalysisView3D | LineOfSightAnalysisView3D | ShadowCastAnalysisView3D | SliceAnalysisView3D | ViewshedAnalysisView3D | VolumeMeasurementAnalysisView3D;