import type AnalysisOriginWebScene from "./support/AnalysisOriginWebScene.js";
import type Accessor from "../core/Accessor.js";
import type { AnalysisType } from "./types.js";
import type { ClonableMixin } from "../core/Clonable.js";
import type { IdentifiableMixin, IdentifiableMixinProperties } from "../core/Identifiable.js";
import type { JSONSupportMixin } from "../core/JSONSupport.js";
import type { AnalysisOriginWebSceneProperties } from "./support/AnalysisOriginWebScene.js";

export interface AnalysisProperties extends IdentifiableMixinProperties {
  /**
   * A user settable identifier for the analysis. A unique value is automatically generated when
   * the analysis is created if it is not set explicitly during construction.
   */
  id?: string;
  /**
   * The origin of the analysis. The origin can be of type `web-scene` when the analysis was applied from the
   * [WebScene.initialViewProperties](https://developers.arcgis.com/javascript/latest/references/core/WebScene/#initialViewProperties) or a
   * [Slide](https://developers.arcgis.com/javascript/latest/references/core/webscene/Slide/).
   */
  origin?: (AnalysisOriginWebSceneProperties & { type: "web-scene" }) | null;
}

/**
 * Abstract base class for all analysis objects.
 *
 * @since 4.33
 */
export default abstract class Analysis extends AnalysisSuperclass {
  /**
   * A user settable identifier for the analysis. A unique value is automatically generated when
   * the analysis is created if it is not set explicitly during construction.
   */
  get id(): string;
  /**
   * The origin of the analysis. The origin can be of type `web-scene` when the analysis was applied from the
   * [WebScene.initialViewProperties](https://developers.arcgis.com/javascript/latest/references/core/WebScene/#initialViewProperties) or a
   * [Slide](https://developers.arcgis.com/javascript/latest/references/core/webscene/Slide/).
   */
  get origin(): AnalysisOriginWebScene | null | undefined;
  set origin(value: (AnalysisOriginWebSceneProperties & { type: "web-scene" }) | null | undefined);
  /** Identifier for the analysis type. */
  abstract readonly type: AnalysisType;
  /**
   * Compares this analysis with another analysis to determine whether they are equivalent.
   *
   * @param other - The other analysis to compare against.
   * @returns `true` if the analyses are equivalent and `false` otherwise.
   * @since 5.0
   */
  equals(other: this): boolean;
}
declare const AnalysisSuperclass: typeof Accessor & typeof IdentifiableMixin & typeof ClonableMixin & typeof JSONSupportMixin