/// <reference path="../../index.d.ts" />
import type SceneView from "@arcgis/core/views/SceneView.js";
import type BuildingSceneLayer from "@arcgis/core/layers/BuildingSceneLayer.js";
import type { PublicLitElement as LitElement } from "@arcgis/lumina";
import type { ArcgisReferenceElement, IconName, HeadingLevel } from "../types.js";
import type { T9nMeta } from "@arcgis/lumina/controllers";

/**
 * The Building Explorer component is used to filter and explore the various building elements of [BuildingSceneLayers](https://developers.arcgis.com/javascript/latest/references/core/layers/BuildingSceneLayer/). BuildingSceneLayers are complex digital models of buildings and interiors and can contain thousands of building elements grouped in sublayers. Using the Building Explorer component, buildings can be filtered by [level](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-building-explorer/#level), [phase](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-building-explorer/#phase) or by disciplines and categories.
 * The visibility of these elements can be configured using the component's [hideLevels](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-building-explorer/#hideLevels), [hidePhases](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-building-explorer/#hidePhases) and [hideDisciplines](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-building-explorer/#hideDisciplines) properties.
 *
 * [![building-explorer](https://developers.arcgis.com/javascript/latest/assets/references/components/building-explorer/building-explorer.avif)](https://developers.arcgis.com/javascript/latest/sample-code/building-scene-layer-filter/)
 *
 * The [BuildingSceneLayers](https://developers.arcgis.com/javascript/latest/references/core/layers/BuildingSceneLayer/) to be explored have to be set on the [layers](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-building-explorer/#layers) property of the component. When setting multiple layers, the filters set by the Building Explorer component will be applied on all layers. The component doesn't allow the user to select between multiple layers present in a scene.
 *
 * Often, [BuildingSceneLayers](https://developers.arcgis.com/javascript/latest/references/core/layers/BuildingSceneLayer/) contain an _Overview_ [BuildingComponentSublayer](https://developers.arcgis.com/javascript/latest/references/core/layers/buildingSublayers/BuildingComponentSublayer/) that serves as an exterior shell and views the building model as a single feature. When a layer is added to the Building Explorer component, the visibility of the _Overview_ layer is turned off, so that the user can directly interact with the individual features in the _Full Model_ [BuildingGroupSublayer](https://developers.arcgis.com/javascript/latest/references/core/layers/buildingSublayers/BuildingGroupSublayer/).
 *
 * The Level element of the Building Explorer component allows to select a single level in one or several buildings. When selecting a level, the levels above it are hidden and the levels below it become semi-transparent for added visual context.
 *
 * Some [BuildingSceneLayers](https://developers.arcgis.com/javascript/latest/references/core/layers/BuildingSceneLayer/) include information indicating the phase in which building elements, such as doors or pipes, were created and, optionally, when they were demolished. If a layer has multiple construction phases, these will be displayed in the Construction phases element. When selecting a construction phase, all the building elements created during or before the phase are selected. Demolished building elements aren't displayed.
 *
 * Discipline layers are [group layers](https://developers.arcgis.com/javascript/latest/references/core/layers/buildingSublayers/BuildingGroupSublayer/) that organize the [BuildingSceneLayers](https://developers.arcgis.com/javascript/latest/references/core/layers/BuildingSceneLayer/) content into architectural, structural, mechanical, or electrical groups. These layers contain a number of Category layers such as walls, windows, furniture, and lighting fixtures. These layers can be turned on and off in the Disciplines and Categories list.
 *
 * The Building Explorer component can only display filters set by the component itself. Filters set by other applications will be ignored.
 *
 * **Known limitations**
 *
 * Building Explorer is only supported in a 3D [arcgis-scene](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-scene/) component.
 *
 * **See also**
 *
 * - [Sample - Filter BuildingSceneLayer with Building Explorer](https://developers.arcgis.com/javascript/latest/sample-code/building-scene-layer-filter/)
 * - [Sample - BuildingSceneLayer with Slice component](https://developers.arcgis.com/javascript/latest/sample-code/building-scene-layer-slice/)
 *
 * @since 4.28
 */
export abstract class ArcgisBuildingExplorer extends LitElement {
  /**
   * If true, the component will not be destroyed automatically when it is
   * disconnected from the document. This is useful when you want to move the
   * component to a different place on the page, or temporarily hide it. If this
   * is set, make sure to call the [destroy()](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-building-explorer/#destroy) method when you are done to
   * prevent memory leaks.
   *
   * @default false
   */
  accessor autoDestroyDisabled: boolean;
  /**
   * Indicates the heading level to use for the component title.
   *
   * @default 3
   * @since 4.28
   */
  accessor headingLevel: HeadingLevel;
  /**
   * If true, the disciplines tree will be hidden.
   *
   * @default false
   * @since 5.0
   */
  accessor hideDisciplines: boolean;
  /**
   * If true, the levels filter will be hidden.
   *
   * @default false
   * @since 5.0
   */
  accessor hideLevels: boolean;
  /**
   * If true, the phases filter will be hidden.
   *
   * @default false
   * @since 5.0
   */
  accessor hidePhases: boolean;
  /**
   * Icon which represents the component.
   * Typically used when the component is controlled by another component (e.g. by the Expand component).
   *
   * @default "organization"
   * @see [Calcite Icons](https://developers.arcgis.com/calcite-design-system/icons/)
   */
  accessor icon: IconName;
  /** The component's default label. */
  accessor label: string | undefined;
  /**
   * A list of layers of type [BuildingSceneLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/BuildingSceneLayer/) that are added to the component for exploration.
   *
   * The component UI is only displayed when this property is set. In case of multiple layers, the component will display and apply the filters on all layers.
   *
   * @since 5.0
   */
  accessor layers: BuildingSceneLayer[];
  /**
   * The currently selected value for the building level filter.
   *
   * @since 5.0
   */
  get level(): number;
  set level(value: number | undefined);
  /**
   * Indicates whether the level picker and filter is disabled. If `true`, the filters expression won't be used to filter a [BuildingSceneLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/BuildingSceneLayer/).
   *
   * @default false
   * @since 5.0
   */
  get levelDisabled(): boolean;
  /**
   * List of the building level values which are allowed for the levels filter.
   *
   * @since 5.0
   */
  get levels(): readonly number[];
  set levels(value: readonly number[] | undefined);
  /** @internal */
  protected messages: {
      level: {
          title: string;
          selectLevel: string;
          clearLevel: string;
          nextLevel: string;
          previousLevel: string;
          currentLevel: string;
      };
      phase: {
          title: string;
          nextPhase: string;
          previousPhase: string;
          currentPhase: string;
      };
      disciplines: {
          title: string;
          expand: string;
          collapse: string;
          hideSublayer: string;
          showSublayer: string;
      };
      failed: string;
      unsupported: string;
      noData: string;
      componentLabel: string;
      loading: string;
  } & T9nMeta<{
      level: {
          title: string;
          selectLevel: string;
          clearLevel: string;
          nextLevel: string;
          previousLevel: string;
          currentLevel: string;
      };
      phase: {
          title: string;
          nextPhase: string;
          previousPhase: string;
          currentPhase: string;
      };
      disciplines: {
          title: string;
          expand: string;
          collapse: string;
          hideSublayer: string;
          showSublayer: string;
      };
      failed: string;
      unsupported: string;
      noData: string;
      componentLabel: string;
      loading: string;
  }>;
  /**
   * The currently selected value for the construction phase filter.
   * Construction phases are used to track site development for a [BuildingSceneLayers](https://developers.arcgis.com/javascript/latest/references/core/layers/BuildingSceneLayer/). Setting a construction phase in the Building Explorer selects everything in the layer which is already constructed at that phase (created phase <= selected phase) but not yet demolished (demolished phase > selected phase). The goal is to display what the building or construction site looks like at that selected phase.
   *
   * @since 5.0
   */
  get phase(): number;
  set phase(value: number | undefined);
  /**
   * Indicates whether the phase picker and filter is disabled. If `true`, the filters expression won't be used to filter a [BuildingSceneLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/BuildingSceneLayer/).
   *
   * @default false
   * @since 5.0
   */
  get phaseDisabled(): boolean;
  /**
   * List of the building phase values which are allowed for the phases filter.
   *
   * @since 5.0
   */
  get phases(): readonly number[];
  set phases(value: readonly number[] | undefined);
  /**
   * By assigning the `id` attribute of the Map or Scene component to this property, you can position a child component anywhere in the DOM while still maintaining a connection to the Map or Scene.
   *
   * @see [Associate components with a Map or Scene component](https://developers.arcgis.com/javascript/latest/programming-patterns/#associate-components-with-a-map-or-scene-component)
   */
  accessor referenceElement: ArcgisReferenceElement | string | undefined;
  /**
   * The view associated with the component. 
   *   > **Note:** The recommended approach is to fully migrate applications to use map and scene components and avoid using MapView and SceneView directly. However, if you are migrating a large application from widgets to components, you might prefer a more gradual transition. To support this use case, the SDK includes this `view` property which connects a component to a MapView or SceneView. Ultimately, once migration is complete, the arcgis-building-explorer component will be associated with a map or scene component rather than using the `view` property.
   */
  accessor view: SceneView | undefined;
  /** Permanently destroy the component. */
  destroy(): Promise<void>;
  "@setterTypes": {
    level?: number | undefined;
    levels?: readonly number[] | undefined;
    phase?: number | undefined;
    phases?: readonly number[] | undefined;
  };
  /**
   * Emitted when the user changes the selected building level, or when a new filter instance is loaded.
   *
   * @since 5.0
   */
  readonly arcgisBuildingLevelChange: import("@arcgis/lumina").TargetedEvent<this, void>;
  /**
   * Emitted when the user changes the selected construction phase, or when a new filter instance is loaded.
   *
   * @since 5.0
   */
  readonly arcgisBuildingPhaseChange: import("@arcgis/lumina").TargetedEvent<this, void>;
  /** Emitted when the component associated with a map or scene view is ready to be interacted with. */
  readonly arcgisReady: import("@arcgis/lumina").TargetedEvent<this, void>;
  readonly "@eventTypes": {
    arcgisBuildingLevelChange: ArcgisBuildingExplorer["arcgisBuildingLevelChange"]["detail"];
    arcgisBuildingPhaseChange: ArcgisBuildingExplorer["arcgisBuildingPhaseChange"]["detail"];
    arcgisReady: ArcgisBuildingExplorer["arcgisReady"]["detail"];
  };
}