import type AreaMeasurementAnalysis from "./AreaMeasurementAnalysis.js";
import type DimensionAnalysis from "./DimensionAnalysis.js";
import type DirectLineMeasurementAnalysis from "./DirectLineMeasurementAnalysis.js";
import type DistanceMeasurementAnalysis from "./DistanceMeasurementAnalysis.js";
import type ElevationProfileAnalysis from "./ElevationProfileAnalysis.js";
import type LineOfSightAnalysis from "./LineOfSightAnalysis.js";
import type ShadowCastAnalysis from "./ShadowCastAnalysis.js";
import type SliceAnalysis from "./SliceAnalysis.js";
import type ViewshedAnalysis from "./ViewshedAnalysis.js";
import type VolumeMeasurementAnalysis from "./VolumeMeasurementAnalysis.js";
import type { ObjectId } from "../views/types.js";

/**
 * Union of all possible analysis types that can be added to a [View](https://developers.arcgis.com/javascript/latest/api-reference/esri-views-View.html).
 *
 * @since 5.0
 */
export type AnalysisUnion = AreaMeasurementAnalysis | DimensionAnalysis | DirectLineMeasurementAnalysis | DistanceMeasurementAnalysis | ElevationProfileAnalysis | LineOfSightAnalysis | ShadowCastAnalysis | SliceAnalysis | ViewshedAnalysis | VolumeMeasurementAnalysis;

/** @since 5.0 */
export type AnalysisType = AnalysisUnion["type"];

/** @since 5.0 */
export interface FeatureReferenceLayer {
  /**
   * The layer id.
   *
   * @since 5.0
   */
  id: string | number;
  /**
   * The object id field.
   *
   * @since 5.0
   */
  objectIdField?: string | null;
}

/**
 * A reference to a feature in a layer. The interface of a feature reference is compatible with a
 * [Graphic](https://developers.arcgis.com/javascript/latest/api-reference/esri-Graphic.html), but contains only the minimal set of information required
 * to reference a feature.
 *
 * @since 5.0
 */
export interface FeatureReference {
  /**
   * Unique identifier assigned to the feature on the client.
   *
   * @since 5.0
   */
  uid: number | null;
  /**
   * Object identifier of the feature in its source layer.
   *
   * @since 5.0
   */
  objectId?: ObjectId | null;
  /**
   * Reference to a layer.
   *
   * @since 5.0
   */
  layer?: FeatureReferenceLayer | null;
  /**
   * Feature attributes.
   *
   * @since 5.0
   */
  attributes: any;
}