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, JSONSupportMixinProperties } 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 extends JSONSupportMixinProperties {
  /** Contains the facility features of a floor plan, which describe the footprints of managed buildings and other structures. The [FloorFilter](https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-FloorFilter.html) widget 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 [FloorFilter](https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-FloorFilter.html) widget 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 [FloorFilter](https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-FloorFilter.html) widget 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 [FloorFilter](https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-FloorFilter.html) widget to explore the floor-aware data based on the configured site, facility, and level layers. The [FloorFilter](https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-FloorFilter.html) widget currently supports [FeatureLayers](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-FeatureLayer.html), [SceneLayers](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-SceneLayer.html) and [MapImageLayers](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-MapImageLayer.html) (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/api-reference/esri-views-MapView.html) or [SceneView](https://developers.arcgis.com/javascript/latest/api-reference/esri-views-SceneView.html), to a site, a facility in the site, or a level in the facility.
 *
 * @since 4.19
 * @see [FloorFilter](https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-FloorFilter.html)
 * @see [WebMap#floorInfo](https://developers.arcgis.com/javascript/latest/api-reference/esri-WebMap.html#floorInfo)
 * @see [WebScene#floorInfo](https://developers.arcgis.com/javascript/latest/api-reference/esri-WebScene.html#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 [FloorFilter](https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-FloorFilter.html) widget 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 [FloorFilter](https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-FloorFilter.html) widget 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 [FloorFilter](https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-FloorFilter.html) widget 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);
}