import type FacilityLayerInfo from "../layers/support/FacilityLayerInfo.js";
import type LevelLayerInfo from "../layers/support/LevelLayerInfo.js";
import type SiteLayerInfo from "../layers/support/SiteLayerInfo.js";
import type { JSONSupport } from "../core/JSONSupport.js";
import type { LevelLayerInfoProperties } from "../layers/support/LevelLayerInfo.js";
import type { FacilityLayerInfoProperties } from "../layers/support/FacilityLayerInfo.js";
import type { SiteLayerInfoProperties } from "../layers/support/SiteLayerInfo.js";

export interface MapFloorInfoProperties {
  /** Contains the facility features of a floor plan, which describe the footprints of managed buildings and other structures. The [Floor Filter](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-floor-filter/) component uses this property to identify what facilities exist in your map to use for navigation and filtering. */
  facilityLayer?: FacilityLayerInfoProperties | null;
  /** Contains the level features of a floor plan, which describe the footprint of each occupiable floor contained in a managed facility. The [Floor Filter](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-floor-filter/) component uses this property to identify what levels exist in your map to use for filtering. */
  levelLayer?: LevelLayerInfoProperties | null;
  /** Contains the site features of a floor plan, which describe the boundaries of managed sites and is used for visualization in mapmaking. The [Floor Filter](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-floor-filter/) component uses this property to identify the sites in your map to use for navigation and filtering. */
  siteLayer?: SiteLayerInfoProperties | null;
}

/**
 * Floor-aware maps facilitate visualizing, editing, and analyzing indoor data and they allow for fast navigation of buildings in maps and scenes. To visualize your data based on a site, facility, or level, your map must contain the related floor plan layers, with features linked together in a floor plan hierarchy as done in the [ArcGIS Indoors Information Model](https://pro.arcgis.com/en/pro-app/latest/help/data/indoors/arcgis-indoors-information-model.htm).
 * Once you define the properties to make your map floor-aware, you can use the [Floor Filter](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-floor-filter/) component to explore the floor-aware data based on the configured site, facility, and level layers. The [Floor Filter](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-floor-filter/) 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 floor filter allows you to filter the floor plan data that is displayed in your [MapView](https://developers.arcgis.com/javascript/latest/references/core/views/MapView/) or [SceneView](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/), to a site, a facility in the site, or a level in the facility.
 *
 * @since 4.19
 * @see [Floor Filter](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-floor-filter/)
 * @see [WebMap.floorInfo](https://developers.arcgis.com/javascript/latest/references/core/WebMap/#floorInfo)
 * @see [WebScene.floorInfo](https://developers.arcgis.com/javascript/latest/references/core/WebScene/#floorInfo)
 */
export default class MapFloorInfo extends JSONSupport {
  constructor(properties?: MapFloorInfoProperties);
  /** Contains the facility features of a floor plan, which describe the footprints of managed buildings and other structures. The [Floor Filter](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-floor-filter/) component uses this property to identify what facilities exist in your map to use for navigation and filtering. */
  get facilityLayer(): FacilityLayerInfo | null | undefined;
  set facilityLayer(value: FacilityLayerInfoProperties | null | undefined);
  /** Contains the level features of a floor plan, which describe the footprint of each occupiable floor contained in a managed facility. The [Floor Filter](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-floor-filter/) component uses this property to identify what levels exist in your map to use for filtering. */
  get levelLayer(): LevelLayerInfo | null | undefined;
  set levelLayer(value: LevelLayerInfoProperties | null | undefined);
  /** Contains the site features of a floor plan, which describe the boundaries of managed sites and is used for visualization in mapmaking. The [Floor Filter](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-floor-filter/) component uses this property to identify the sites in your map to use for navigation and filtering. */
  get siteLayer(): SiteLayerInfo | null | undefined;
  set siteLayer(value: SiteLayerInfoProperties | null | undefined);
}