/// <reference path="../../index.d.ts" />
import type FeatureLayer from "@arcgis/core/layers/FeatureLayer.js";
import type MapView from "@arcgis/core/views/MapView.js";
import type { IBasemapConfig, IMapInfo, ISearchConfiguration, VisibilityIconType } from "../../utils/interfaces.js";
import type { PublicLitElement as LitElement } from "@arcgis/lumina";
import type { UIPosition } from "@arcgis/core/views/ui/types.js";
import type { T9nMeta } from "@arcgis/lumina/controllers";

export abstract class MapTools extends LitElement {
  /**
   * Contains the translations for this component.
   * All UI strings should be defined here.
   *
   * @internal
   */
  protected _translations: {
      legend: string;
      search: string;
      expand: string;
      basemap: string;
      layers: string;
      collapse: string;
      enterFullscreen: string;
      exitFullscreen: string;
      floorFilter: string;
      selectionTools: string;
      selectByRectangle: string;
      selectByLasso: string;
      clearSelection: string;
      defaultMapView: string;
  } & T9nMeta<{
      legend: string;
      search: string;
      expand: string;
      basemap: string;
      layers: string;
      collapse: string;
      enterFullscreen: string;
      exitFullscreen: string;
      floorFilter: string;
      selectionTools: string;
      selectByRectangle: string;
      selectByLasso: string;
      clearSelection: string;
      defaultMapView: string;
  }>;
  /** IBasemapConfig: List of any basemaps to filter out from the basemap widget */
  accessor basemapConfig: IBasemapConfig | undefined;
  /**
   * boolean: when true the layer order should be defined in the enabledLayerIds, when false we will use the older logic of layers first then tables
   *
   * @default false
   */
  accessor configLayerOrderDefined: boolean;
  /**
   * string: when provided this layer ID will be used when the app loads
   *
   * @default ''
   */
  accessor defaultLayerId: string;
  /**
   * boolean: when true the basemap widget will be available
   *
   * @default false
   */
  accessor enableBasemap: boolean;
  /**
   * string[]: Optional list of enabled layer ids
   *  If empty all layers will be available
   */
  accessor enabledLayerIds: string[];
  /**
   * boolean: when true the floor filter widget will be available
   *
   * @default false
   */
  accessor enableFloorFilter: boolean;
  /**
   * boolean: when true the fullscreen widget will be available
   *
   * @default false
   */
  accessor enableFullscreen: boolean;
  /**
   * boolean: when true the home widget will be available
   *
   * @default false
   */
  accessor enableHome: boolean;
  /**
   * boolean: when true the layer list widget will be available
   *
   * @default false
   */
  accessor enableLayerList: boolean;
  /**
   * boolean: when true the legend widget will be available
   *
   * @default false
   */
  accessor enableLegend: boolean;
  /**
   * boolean: when true the map layer picker will be available
   *
   * @default false
   */
  accessor enableMapLayerPicker: boolean;
  /**
   * boolean: when true the map picker will be available
   *
   * @default false
   */
  accessor enableMapPicker: boolean;
  /**
   * boolean: when true the search widget will be available
   *
   * @default false
   */
  accessor enableSearch: boolean;
  /**
   * boolean: when true the selection tools will be available
   *
   * @default false
   */
  accessor enableSelectionTool: boolean;
  /**
   * boolean: when true map tools will be displayed within a single expand/collapse widget
   * when false widgets will be loaded individually into expand widgets
   *
   * @default false
   */
  accessor enableSingleExpand: boolean;
  /**
   * When true the component will render an optimized view for mobile devices
   *
   * @default false
   */
  accessor isMobile: boolean;
  /**
   * 'horizontal' | 'vertical': used to control the orientation of the tools
   *
   * @default 'vertical'
   */
  accessor layout: "horizontal" | "vertical";
  /** IMapInfo: key configuration details about the current map */
  accessor mapInfo: IMapInfo | undefined;
  /** IMapInfo[]: array of map infos (name and id) */
  accessor mapInfos: IMapInfo[];
  /** esri/views/View: https://developers.arcgis.com/javascript/latest/api-reference/esri-views-MapView.html */
  accessor mapView: MapView | undefined;
  /**
   * 's' | 'm' | 'l': Used for optional map tool widget
   *
   * @default 'm'
   */
  accessor mapWidgetsSize: "l" | "m" | "s";
  /** Parent component height */
  accessor parentComponentHeight: number | undefined;
  /** Parent component width */
  accessor parentComponentWidth: number | undefined;
  /**
   * UIPosition: https://developers.arcgis.com/javascript/latest/api-reference/esri-views-ui-UI.html#UIPosition
   * The position details for the tools
   *
   * @default 'top-leading'
   */
  accessor position: UIPosition;
  /** ISearchConfiguration: Configuration details for the Search widget */
  accessor searchConfiguration: ISearchConfiguration | undefined;
  /** number[]: A list of ids that are currently selected */
  accessor selectedFeaturesIds: (number | string)[];
  /** FeatureLayer: Selected feature layer */
  accessor selectedLayer: FeatureLayer | undefined;
  /**
   * string: selected web map
   *
   * @default ''
   */
  accessor selectedWebMapId: string;
  /** string[]: Selection tools to show */
  accessor selectionTools: string[];
  /**
   * boolean: When true only editable layers that support the update capability will be available
   *
   * @default false
   */
  accessor showOnlyUpdatableLayers: boolean;
  /**
   * boolean: When true the map widget tools will have no margin between them.
   * When false the map widget tools will have a margin between them.
   *
   * @default true
   */
  accessor stackTools: boolean;
  /**
   * Tools to show and its order
   * Valid tools: 'home', 'legend', 'search', 'fullscreen', 'basemap', 'floorfilter', 'selectiontool', 'layers-list', 'map-picker', 'map-layer-picker'
   */
  accessor toolOrder: string[];
  /**
   * VisibilityIconType: visibility icon for the layer list widget
   *
   * @default 'eyeball'
   */
  accessor visibilityIcon: VisibilityIconType;
  /**
   * 's' | 'm' | 'l': Used for Zoom tools
   *
   * @default 'm'
   */
  accessor zoomToolsSize: "l" | "m" | "s";
  /** Emitted on demand when clear selection button is clicked */
  readonly clearSelection: import("@arcgis/lumina").TargetedEvent<this, void>;
  readonly "@eventTypes": {
    clearSelection: MapTools["clearSelection"]["detail"];
  };
}