import type Point from "../geometry/Point.js";
import type ElevationInfo from "../symbols/support/ElevationInfo.js";
import type { FeatureReference } from "./types.js";
import type { Clonable } 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 LineOfSightAnalysisTargetProperties extends Partial<Pick<LineOfSightAnalysisTarget, "feature">> {
  /**
   * Specifies how the target 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/LineOfSightAnalysisTarget/#position) properties of the target.
   */
  elevationInfo?: ElevationInfoProperties | null;
  /**
   * A [Point](https://developers.arcgis.com/javascript/latest/references/core/geometry/Point/) representing the position of the target. Once the position is set, a new line of
   * sight analysis will synchronously calculate the intersection and the visibility.
   */
  position?: PointProperties | null;
}

/**
 * The LineOfSightAnalysisTarget represents a target of a [LineOfSightAnalysis](https://developers.arcgis.com/javascript/latest/references/core/analysis/LineOfSightAnalysis/).
 *
 * Use the position property to specify the position of the target.
 *
 * @since 4.23
 * @see [LineOfSightAnalysis](https://developers.arcgis.com/javascript/latest/references/core/analysis/LineOfSightAnalysis/)
 * @see [LineOfSightAnalysisObserver](https://developers.arcgis.com/javascript/latest/references/core/analysis/LineOfSightAnalysisObserver/)
 * @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 LineOfSightAnalysisTarget extends LineOfSightAnalysisTargetSuperclass {
  constructor(properties?: LineOfSightAnalysisTargetProperties);
  /**
   * Specifies how the target 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/LineOfSightAnalysisTarget/#position) properties of the target.
   */
  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 targets 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 target. Once the position is set, a new line of
   * sight analysis will synchronously calculate the intersection and the visibility.
   */
  get position(): Point | null | undefined;
  set position(value: PointProperties | null | undefined);
}
declare const LineOfSightAnalysisTargetSuperclass: typeof Clonable & typeof JSONSupportMixin