/// <reference path="../../index.d.ts" />
import type WebMap from "@arcgis/core/WebMap.js";
import type WebScene from "@arcgis/core/WebScene.js";
import type { PublicLitElement as LitElement } from "@arcgis/lumina";
import type { ArcgisReferenceElement, IconName, HeadingLevel } from "../types.js";
import type { T9nMeta } from "@arcgis/lumina/controllers";
import type { MapViewOrSceneView } from "@arcgis/core/views/MapViewOrSceneView.js";
import type { GoToOverride } from "@arcgis/core/widgets/support/types.js";

/**
 * The Floor Filter component simplifies visualization of GIS data for a specific floor of a
 * building in your application. It allows you to filter down the floor plan data displayed in your
 * [arcgis-map](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-map/) or [arcgis-scene](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-scene/) to a [site](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-floor-filter/#site), a [facility](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-floor-filter/#facility) in the site,
 * or a [level](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-floor-filter/#level) in the facility.
 *
 * To visualize your data based on [site](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-floor-filter/#site), [facility](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-floor-filter/#facility), or [level](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-floor-filter/#level), your map must contain the related
 * floor plan layers, with features linked together in a floor plan hierarchy.
 * Once you define your map as floor-aware in the map properties, the interactive, on-screen
 * Floor Filter component appears and can be used to explore the floor-aware data based on the
 * configured site, facility, and levels layers.
 * The Floor Filter component currently supports
 * [FeatureLayers](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/),
 * [SceneLayers](https://developers.arcgis.com/javascript/latest/references/core/layers/SceneLayer/) and
 * [MapImageLayers](https://developers.arcgis.com/javascript/latest/references/core/layers/MapImageLayer/) (map services).
 *
 * The component can also be used alongside other filtering functionalities, such as definition queries,
 * selection, range, and time, to further control visualization.
 * For example, you may want to visualize all of the features on a specific level in a facility,
 * or all the office units within a range of levels in a facility.
 *
 * **Note**
 *
 * If a default site, facility, or level is selected in the floor filter when sharing a floor-aware web map from ArcGIS Pro,
 * it will also be the default selection within the Floor Filter component.
 *
 * @since 4.28
 * @example
 * ```html
 * <arcgis-map itemId="f133a698536f44c8884ad81f80b6cfc7">
 *   <arcgis-floor-filter slot="top-right"/>
 * </arcgis-map>
 * ```
 */
export abstract class ArcgisFloorFilter 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-floor-filter/#destroy) method when you are done to
   * prevent memory leaks.
   *
   * @default false
   */
  accessor autoDestroyDisabled: boolean;
  /** The currently selected facility. */
  accessor facility: string | null | undefined;
  /**
   * This function provides the ability to override either the [arcgis-map.goTo()](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-map/#goTo) or [arcgis-scene.goTo()](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-scene/#goTo) methods.
   *
   * @since 5.0
   * @example
   * ```js
   * component.goToOverride = function(view, goToParams) {
   *   goToParams.options = {
   *     duration: updatedDuration
   *   };
   *   return view.goTo(goToParams.target, goToParams.options);
   * };
   * ```
   */
  accessor goToOverride: GoToOverride | null | undefined;
  /**
   * Indicates the heading level to use for the headings separating floors in buildings.
   * By default, the building name is rendered
   * as a level 2 heading (e.g. `<h2>Building name</h2>`). Depending on the component's placement
   * in your app, you may need to adjust this heading for proper semantics. This is
   * important for meeting accessibility standards.
   *
   * @default 2
   * @since 4.20
   * @see [Heading Elements](https://developer.mozilla.org/docs/Web/HTML/Element/Heading_Elements)
   * @example
   * // building headings will render as an <h3>
   * floorFilter.headingLevel = 3;
   */
  accessor headingLevel: HeadingLevel;
  /**
   * Icon which represents the component.
   * Typically used when the component is controlled by another component (e.g. by the Expand component).
   *
   * @default "urban-model"
   * @since 4.27
   * @see [Calcite Icons](https://developers.arcgis.com/calcite-design-system/icons/)
   */
  accessor icon: IconName | undefined;
  /**
   * The component's default label.
   *
   * @since 4.11
   */
  accessor label: string | undefined;
  /** The currently selected floor level. */
  accessor level: string | null | undefined;
  /**
   * Determines if the component is expanded or collapsed.
   * If the value is `true`, the component is expanded and the long names appear.
   * Otherwise, short names are used and icons appear alone on buttons.
   *
   * @default false
   */
  accessor longNames: boolean;
  /**
   * Replace localized message strings with your own strings.
   *
   * _**Note**: Individual message keys may change between releases._
   *
   * @since 5.0
   */
  accessor messageOverrides: {
      all?: string | undefined;
      back?: string | undefined;
      buttons?: {
          browse?: string | undefined;
          zoomTo?: string | undefined;
      } | undefined;
      clear?: string | undefined;
      close?: string | undefined;
      collapse?: string | undefined;
      expand?: string | undefined;
      search?: string | undefined;
      selector?: {
          selectSite?: string | undefined;
          selectFacility?: string | undefined;
          sitesLabel?: string | undefined;
          siteFacilitiesLabel?: string | undefined;
          facilitiesLabel?: string | undefined;
          levelsLabel?: string | undefined;
      } | undefined;
      noResults?: string | undefined;
  };
  /** @internal */
  protected messages: Partial<{
      all: string;
      back: string;
      buttons: {
          browse: string;
          zoomTo: string;
      };
      clear: string;
      close: string;
      collapse: string;
      expand: string;
      search: string;
      selector: {
          selectSite: string;
          selectFacility: string;
          sitesLabel: string;
          siteFacilitiesLabel: string;
          facilitiesLabel: string;
          levelsLabel: string;
      };
      noResults: string;
  }> & T9nMeta<{
      all: string;
      back: string;
      buttons: {
          browse: string;
          zoomTo: string;
      };
      clear: string;
      close: string;
      collapse: string;
      expand: string;
      search: string;
      selector: {
          selectSite: string;
          selectFacility: string;
          sitesLabel: string;
          siteFacilitiesLabel: string;
          facilitiesLabel: string;
          levelsLabel: string;
      };
      noResults: string;
  }>;
  /**
   * 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 currently selected site. */
  accessor site: string | null | 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-floor-filter component will be associated with a map or scene component rather than using the `view` property.
   */
  accessor view: MapViewOrSceneView | null | undefined;
  /** Permanently destroy the component. */
  destroy(): Promise<void>;
  /** @param webMap */
  updateWebDocument(webMap: WebMap | WebScene): Promise<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": {
    arcgisReady: ArcgisFloorFilter["arcgisReady"]["detail"];
  };
}