import type Accessor from "../core/Accessor.js";
import type Point from "../geometry/Point.js";
import type ElevationInfo from "../symbols/support/ElevationInfo.js";
import type { FeatureReference } from "./types.js";
import type { ClonableMixin } from "../core/Clonable.js";
import type { JSONSupportMixin } from "../core/JSONSupport.js";
import type { PointProperties } from "../geometry/Point.js";
import type { ElevationInfoProperties } from "../symbols/support/ElevationInfo.js";

export interface LineOfSightAnalysisObserverProperties extends Partial<Pick<LineOfSightAnalysisObserver, "feature">> {
  /**
   * Specifies how the observer is placed on the vertical axis (z). See the [ElevationInfo sample](https://developers.arcgis.com/javascript/latest/sample-code/scene-elevationinfo/)
   * for an example of how this property may be used.
   *
   * > [!WARNING]
   * >
   * > [ElevationInfo.featureExpressionInfo](https://developers.arcgis.com/javascript/latest/references/core/symbols/support/ElevationInfo/#featureExpressionInfo) and [ElevationInfo.unit](https://developers.arcgis.com/javascript/latest/references/core/symbols/support/ElevationInfo/#unit) are not supported when the elevation info is specified for this class.
   * > If the elevation info is not specified, the effective elevation depends on the [position](https://developers.arcgis.com/javascript/latest/references/core/analysis/LineOfSightAnalysisObserver/#position) properties of the observer.
   */
  elevationInfo?: ElevationInfoProperties | null;
  /**
   * A [Point](https://developers.arcgis.com/javascript/latest/references/core/geometry/Point/) representing the position of the observer. Once the position is set, a new line of
   * sight analysis will synchronously calculate the intersection and the visibility to each target of the associated
   * [LineOfSightAnalysis](https://developers.arcgis.com/javascript/latest/references/core/analysis/LineOfSightAnalysis/).
   *
   * If the observer is assigned to a [LineOfSightLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/LineOfSightLayer/) then this property
   * must be defined before the layer can be saved to a [WebScene](https://developers.arcgis.com/javascript/latest/references/core/WebScene/).
   */
  position?: PointProperties | null;
}

/**
 * The LineOfSightAnalysisObserver represents an observer of a [LineOfSightAnalysis](https://developers.arcgis.com/javascript/latest/references/core/analysis/LineOfSightAnalysis/).
 *
 * Use the position property to specify the position of the observer.
 *
 * @since 4.23
 * @see [LineOfSightAnalysis](https://developers.arcgis.com/javascript/latest/references/core/analysis/LineOfSightAnalysis/)
 * @see [LineOfSightAnalysisView3D](https://developers.arcgis.com/javascript/latest/references/core/views/3d/analysis/LineOfSightAnalysisView3D/)
 * @see [Line Of Sight component](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-line-of-sight/)
 * @see [Sample - Analysis objects](https://developers.arcgis.com/javascript/latest/sample-code/analysis-objects/)
 * @see [Sample - Line of sight component](https://developers.arcgis.com/javascript/latest/sample-code/line-of-sight/)
 */
export default class LineOfSightAnalysisObserver extends LineOfSightAnalysisObserverSuperclass {
  constructor(properties?: LineOfSightAnalysisObserverProperties);
  /**
   * Specifies how the observer is placed on the vertical axis (z). See the [ElevationInfo sample](https://developers.arcgis.com/javascript/latest/sample-code/scene-elevationinfo/)
   * for an example of how this property may be used.
   *
   * > [!WARNING]
   * >
   * > [ElevationInfo.featureExpressionInfo](https://developers.arcgis.com/javascript/latest/references/core/symbols/support/ElevationInfo/#featureExpressionInfo) and [ElevationInfo.unit](https://developers.arcgis.com/javascript/latest/references/core/symbols/support/ElevationInfo/#unit) are not supported when the elevation info is specified for this class.
   * > If the elevation info is not specified, the effective elevation depends on the [position](https://developers.arcgis.com/javascript/latest/references/core/analysis/LineOfSightAnalysisObserver/#position) properties of the observer.
   */
  get elevationInfo(): ElevationInfo | null | undefined;
  set elevationInfo(value: ElevationInfoProperties | null | undefined);
  /**
   * References a feature which is excluded from the intersection testing.
   * It is used to ensure that the analysis results remain independent of changes in the level of detail (LOD) of this feature's geometry.
   *
   * When creating or editing the observer interactively, this property is populated automatically.
   *
   * Note that you can assign client side graphics which will be taken into account accordingly. However, information about
   * client side graphic will not be persisted and results in an empty reference after de-serialization.
   */
  accessor feature: FeatureReference | null | undefined;
  /**
   * A [Point](https://developers.arcgis.com/javascript/latest/references/core/geometry/Point/) representing the position of the observer. Once the position is set, a new line of
   * sight analysis will synchronously calculate the intersection and the visibility to each target of the associated
   * [LineOfSightAnalysis](https://developers.arcgis.com/javascript/latest/references/core/analysis/LineOfSightAnalysis/).
   *
   * If the observer is assigned to a [LineOfSightLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/LineOfSightLayer/) then this property
   * must be defined before the layer can be saved to a [WebScene](https://developers.arcgis.com/javascript/latest/references/core/WebScene/).
   */
  get position(): Point | null | undefined;
  set position(value: PointProperties | null | undefined);
}
declare const LineOfSightAnalysisObserverSuperclass: typeof Accessor & typeof ClonableMixin & typeof JSONSupportMixin