/// <reference path="../../index.d.ts" />
import type MapView from "@arcgis/core/views/MapView.js";
import type { IBeforeLayerSelectionChange } from "../../utils/interfaces.js";
import type { PublicLitElement as LitElement } from "@arcgis/lumina";
import type { Icon as Icon } from "@esri/calcite-components/components/calcite-icon";
import type { T9nMeta } from "@arcgis/lumina/controllers";

export abstract class MapLayerPicker extends LitElement {
  /**
   * T9nStrings: Strings for the UI
   *
   * @internal
   */
  protected _translations: {
      noLayersFound: string;
      enableEditUpdate: string;
      switchLayer: string;
  } & T9nMeta<{
      noLayersFound: string;
      enableEditUpdate: string;
      switchLayer: string;
  }>;
  /**
   * 'transparent' | 'solid': controls the button appearance when using the 'dropdown' type
   *
   * @default 'transparent'
   */
  accessor appearance: "solid" | "transparent";
  /**
   * 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 layer picker should be disabled
   *
   * @default false
   */
  accessor disabled: boolean | undefined;
  /**
   * 'inline-flex' | 'inline-block': controls the display style of the dropdown
   *
   * @default 'inline-block'
   */
  accessor display: "inline-block" | "inline-flex";
  /**
   * string[]: Optional list of enabled layer ids
   *  If empty all layers will be available
   */
  accessor enabledLayerIds: string[];
  /**
   * number: optional fixed height value for the control.
   * Specified as pixel height.
   */
  accessor height: number | undefined;
  /**
   * When true the component will render an optimized view for mobile devices
   *
   * @default false
   */
  accessor isMobile: boolean;
  /** esri/views/View: https://developers.arcgis.com/javascript/latest/api-reference/esri-views-MapView.html */
  accessor mapView: MapView | undefined;
  /** string: optional placeholder icon used with 'combobox' type */
  accessor placeholderIcon: Icon["icon"] | undefined;
  /**
   * string: Refrence element for the calcite popover to show the layer list
   *
   * @default ''
   */
  accessor referenceElement: string;
  /**
   * 's' | 'm' | 'l': scale to render the component
   *
   * @default 'm'
   */
  accessor scale: "l" | "m" | "s";
  /** string[]: list of layer ids that have been selected by the end user */
  accessor selectedIds: string[];
  /**
   * boolean: When true all layers list should shown in a popover (reference element prop required)
   * In this case the selected layer will not shown as label
   *
   * @default false
   */
  accessor showLayersListInPopover: boolean;
  /**
   * boolean: When true only editable layers that support the update capability will be available
   *
   * @default false
   */
  accessor showOnlyUpdatableLayers: boolean;
  /**
   * boolean: when true a map with a single layer will show a label rather than a dropdown
   * Used in conjunction with _hasMultipleLayers
   *
   * @default false
   */
  accessor showSingleLayerAsLabel: boolean;
  /**
   * boolean: when true standalone tables will also be available
   *
   * @default false
   */
  accessor showTables: boolean;
  /**
   * boolean: when true table will shown as disabled
   *
   * @default false
   */
  accessor showTablesDisabled: boolean;
  /**
   * 'select' | 'combobox' | 'dropdown': type of component to leverage
   *
   * @default 'select'
   */
  accessor type: "combobox" | "dropdown" | "select";
  /**
   * Set the layer by id
   *
   * @param id
   * @param skipEditCheck
   */
  setLayerById(id: string, skipEditCheck?: boolean): Promise<void>;
  /**
   * Set the layers by ids
   *
   * @param ids
   * @param skipEditCheck
   */
  setLayerByIds(ids: string[], skipEditCheck?: boolean): Promise<void>;
  /** updates the layers */
  updateLayer(): Promise<void>;
  /** Emitted before a new map is loaded */
  readonly beforeLayerSelectionChange: import("@arcgis/lumina").TargetedEvent<this, IBeforeLayerSelectionChange>;
  /** Emitted on demand when valid layers/tables are found */
  readonly idsFound: import("@arcgis/lumina").TargetedEvent<this, string[]>;
  /** Emitted on demand when a layer is selected */
  readonly layerSelectionChange: import("@arcgis/lumina").TargetedEvent<this, string[]>;
  /** Emitted on demand when no valid layers are found */
  readonly noLayersFound: import("@arcgis/lumina").TargetedEvent<this, void>;
  readonly "@eventTypes": {
    beforeLayerSelectionChange: MapLayerPicker["beforeLayerSelectionChange"]["detail"];
    idsFound: MapLayerPicker["idsFound"]["detail"];
    layerSelectionChange: MapLayerPicker["layerSelectionChange"]["detail"];
    noLayersFound: MapLayerPicker["noLayersFound"]["detail"];
  };
}