/// <reference path="../../index.d.ts" />
import type MapView from "@arcgis/core/views/MapView.js";
import type FeatureLayer from "@arcgis/core/layers/FeatureLayer.js";
import type { AppLayout, IBasemapConfig, IMapChange, IMapInfo, theme, 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 MapCard extends LitElement {
  /**
   * Contains the translations for this component.
   * All UI strings should be defined here.
   *
   * @internal
   */
  protected _translations: {
      mapName: string;
      more: string;
      filters: string;
      zoom: string;
      refresh: string;
      editMultiple: string;
      featureEditLimitNotice: string;
      clearSelection: string;
      share: string;
      copy: string;
      paste: string;
  } & T9nMeta<{
      mapName: string;
      more: string;
      filters: string;
      zoom: string;
      refresh: string;
      editMultiple: string;
      featureEditLimitNotice: string;
      clearSelection: string;
      share: string;
      copy: string;
      paste: string;
  }>;
  /** AppLayout: the current app layout */
  accessor appLayout: AppLayout | undefined;
  /** Array of objects containing proxy information for premium platform services. */
  accessor appProxies: any;
  /** IBasemapConfig: List of any basemaps to filter out from the basemap widget */
  accessor basemapConfig: IBasemapConfig | undefined;
  /**
   * string: when provided this layer ID will be used when the app loads
   *
   * @default ''
   */
  accessor defaultLayerId: string;
  /**
   * string: Item ID of the web map that should be selected by default when the app loads
   *
   * @default ''
   */
  accessor defaultWebmapId: string;
  /**
   * boolean: when true the basemap widget will be available
   *
   * @default false
   */
  accessor enableBasemap: boolean;
  /**
   * 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 true
   */
  accessor enableLayerList: boolean;
  /**
   * boolean: when true the legend widget will be available
   *
   * @default false
   */
  accessor enableLegend: boolean;
  /**
   * boolean: when true the map layer picker tool will be available
   *
   * @default false
   */
  accessor enableMapLayerPicker: boolean;
  /**
   * boolean: when true the map picker tool 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 selectionTool tool will be available
   *
   * @default false
   */
  accessor enableSelectionTool: boolean;
  /**
   * boolean: when true the share widget will be available
   *
   * @default false
   */
  accessor enableShare: 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;
  /**
   * string: Selection mode for the feature selection
   *
   * @default 'multiple'
   */
  accessor featureSelectionMode: string;
  /**
   * boolean: When true the map display will be hidden
   *
   * @default false
   */
  accessor hide: boolean;
  /**
   * boolean: When true map will shown is full screen
   *
   * @default false
   */
  accessor isMapLayout: boolean;
  /**
   * When true the component will render an optimized view for mobile devices
   *
   * @default false
   */
  accessor isMobile: boolean;
  /**
   * string: Id to pass in the map component
   *
   * @default 'arcgis-map'
   */
  accessor mapComponentId: string;
  /** IMapInfo: key configuration details about the current map */
  accessor mapInfo: IMapInfo | undefined;
  /** IMapInfo[]: array of map infos (name and id) */
  accessor mapInfos: IMapInfo[];
  /** Valid tools: 'legend', 'search', 'fullscreen', 'basemap', 'floorfilter', 'selectiontool' */
  accessor mapToolsOrder: string[];
  /** esri/views/View: https://developers.arcgis.com/javascript/latest/api-reference/esri-views-MapView.html */
  accessor mapView: MapView | undefined;
  /**
   * number: The placement index of the map widgets (legend, basemap, fullscreen etc). This index shows where to place the component relative to other components.
   * For example a value of 0 would place it topmost when position is top-*, leftmost for bottom-left and right most for bottom-right.
   *
   * @default 0
   */
  accessor mapWidgetsIndex: number;
  /**
   * UIPosition: The position details for the mobile map tools
   *
   * @default 'top-leading'
   */
  accessor mapWidgetsPosition: UIPosition;
  /**
   * 's' | 'm' | 'l': Used for optional map tool widget
   *
   * @default 'm'
   */
  accessor mapWidgetsSize: "l" | "m" | "s";
  /**
   * UIPosition: The position details for the mobile map tools
   *
   * @default 'top-right'
   */
  accessor mobileMapWidgetsPosition: UIPosition;
  /** Valid tools: 'map-picker', 'map-layer-picker' */
  accessor mobileToolsOrder: string[];
  /**
   * boolean: When true the paste action will be enabled
   *
   * @default false
   */
  accessor pasteEnabled: boolean;
  /** number[]: A list of ids that are currently selected */
  accessor selectedFeaturesIds: (number | string)[];
  /** FeatureLayer: Selected layer */
  accessor selectedLayer: FeatureLayer | undefined;
  /**
   * boolean: When true the share options will include embed option
   *
   * @default false
   */
  accessor shareIncludeEmbed: boolean;
  /**
   * boolean: When true the share options will include social media sharing
   *
   * @default false
   */
  accessor shareIncludeSocial: boolean;
  /**
   * boolean: When true only the copy and paste actions will be shown in the selection tool
   *
   * @default false
   */
  accessor showCopyPasteActions: boolean;
  /**
   * 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 false
   */
  accessor stackTools: boolean;
  /** theme: 'light' | 'dark' theme to be used */
  accessor theme: theme | undefined;
  /**
   * VisibilityIconType: visibility icon for the layer list widget
   *
   * @default 'eyeball'
   */
  accessor visibilityIcon: VisibilityIconType;
  /**
   * 's' | 'm' | 'l': Used for Zoom and Home tools
   *
   * @default 'm'
   */
  accessor zoomToolsSize: "l" | "m" | "s";
  /** number: default scale to zoom to when zooming to a single point feature */
  accessor zoomToScale: number | undefined;
  /** Reset the filter */
  resetFilter(): Promise<void>;
  /**
   * updates the filter
   *
   * @param active
   */
  updateFilterState(active: boolean): Promise<void>;
  /** updates the layer in map layer picker */
  updateLayer(): Promise<void>;
  /** Emitted before a new map is loaded */
  readonly beforeMapChanged: import("@arcgis/lumina").TargetedEvent<this, void>;
  /** Emitted on demand when clear selection button is clicked */
  readonly clearSelection: import("@arcgis/lumina").TargetedEvent<this, void>;
  /** Emitted on demand when copy action is clicked */
  readonly copyFeatures: import("@arcgis/lumina").TargetedEvent<this, {
      featuresIds: (number | string)[];
      layerId: string | undefined;
  }>;
  /** Emitted on demand when edit multiple action is clicked */
  readonly editMultipleFeatures: import("@arcgis/lumina").TargetedEvent<this, (number | string)[]>;
  /** Emitted when the features have been copied to the clipboard */
  readonly featuresCopied: import("@arcgis/lumina").TargetedEvent<this, void>;
  /** Emitted when a new map is loaded */
  readonly mapChanged: import("@arcgis/lumina").TargetedEvent<this, IMapChange>;
  /** Emitted on demand when paste action is clicked */
  readonly pasteFeatures: import("@arcgis/lumina").TargetedEvent<this, void>;
  /** Emitted on demand when filter action is clicked */
  readonly toggleFilter: import("@arcgis/lumina").TargetedEvent<this, void>;
  readonly "@eventTypes": {
    beforeMapChanged: MapCard["beforeMapChanged"]["detail"];
    clearSelection: MapCard["clearSelection"]["detail"];
    copyFeatures: MapCard["copyFeatures"]["detail"];
    editMultipleFeatures: MapCard["editMultipleFeatures"]["detail"];
    featuresCopied: MapCard["featuresCopied"]["detail"];
    mapChanged: MapCard["mapChanged"]["detail"];
    pasteFeatures: MapCard["pasteFeatures"]["detail"];
    toggleFilter: MapCard["toggleFilter"]["detail"];
  };
}