import type Graphic from "../Graphic.js";
import type PopupTemplate from "../PopupTemplate.js";
import type Collection from "../core/Collection.js";
import type Portal from "../portal/Portal.js";
import type Widget from "./Widget.js";
import type SearchViewModel from "./Search/SearchViewModel.js";
import type { Icon } from "@esri/calcite-components/components/calcite-icon";
import type { MapViewOrSceneView } from "../views/MapViewOrSceneView.js";
import type { WidgetProperties } from "./Widget.js";
import type { SearchViewModelEvents, SearchViewModelProperties } from "./Search/SearchViewModel.js";
import type { SearchItem, SearchResponse, SearchResult, BaseSearchResults, SuggestResponse, SupportedSearchSource, SourcesHandler } from "./Search/types.js";
import type { GoToOverride } from "./support/types.js";
import type { PopupTemplateProperties } from "../PopupTemplate.js";
import type { PortalProperties } from "../portal/Portal.js";
import type { LayerSearchSourceProperties } from "./Search/LayerSearchSource.js";
import type { LocatorSearchSourceProperties } from "./Search/LocatorSearchSource.js";
import type { ReadonlyArrayOrCollection } from "../core/Collection.js";

/** Configurable Search properties of the widget. */
export interface SearchProperties extends WidgetProperties, Partial<Pick<Search, "activeMenu" | "activeSourceIndex" | "allPlaceholder" | "autoNavigate" | "autoSelect" | "disabled" | "goToOverride" | "includeDefaultSources" | "locationEnabled" | "maxResults" | "maxSuggestions" | "minSuggestCharacters" | "popupEnabled" | "resultGraphic" | "resultGraphicEnabled" | "searchAllEnabled" | "searchTerm" | "suggestionsEnabled" | "view">> {
  /**
   * Icon which represents the widget. It is typically used when the widget is controlled by another
   * one (e.g. in the Expand widget).
   *
   * @default "search"
   * @since 4.27
   * @see [Calcite Icon Search](https://developers.arcgis.com/calcite-design-system/icons/)
   * @see [Calcite Icon Search](https://developers.arcgis.com/calcite-design-system/icons/)
   */
  icon?: Icon["icon"] | null;
  /**
   * The widget's default label.
   *
   * @since 4.7
   */
  label?: string | null;
  /**
   * A customized [PopupTemplate](https://developers.arcgis.com/javascript/latest/references/core/PopupTemplate/) for the selected feature.
   * Note that any [templates](https://developers.arcgis.com/javascript/latest/references/core/PopupTemplate/)
   * defined on [allSources](https://developers.arcgis.com/javascript/latest/references/core/widgets/Search/#allSources) take precedence over those defined directly on the template.
   */
  popupTemplate?: PopupTemplateProperties | null;
  /**
   * It is possible to search a specified portal instance's [locator services](https://doc.esri.com/en/arcgis-enterprise/latest/administer/configure-portal-to-geocode-addresses.html)
   * Use this property to set this [ArcGIS Portal](https://enterprise.arcgis.com/en/portal/) instance to search.
   *
   * @since 4.8
   */
  portal?: PortalProperties | null;
  /**
   * The Search widget may be used to search features in a
   * [map](https://developers.arcgis.com/javascript/latest/references/core/layers/MapImageLayer/)/[feature](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/) service feature
   * layer(s), [SceneLayers](https://developers.arcgis.com/javascript/latest/references/core/layers/SceneLayer/) with an associated feature layer,
   * [BuildingComponentSublayer](https://developers.arcgis.com/javascript/latest/references/core/layers/buildingSublayers/BuildingComponentSublayer/) with an associated feature layer,
   * [GeoJSONLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/GeoJSONLayer/), [CSVLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/CSVLayer/) or
   * [OGCFeatureLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/OGCFeatureLayer/), or [table](https://developers.arcgis.com/javascript/latest/references/core/webdoc/applicationProperties/SearchTable/),
   * or geocode locations with a [locator](https://developers.arcgis.com/javascript/latest/references/core/rest/locator/). The `sources` property defines the sources from which
   * to search for the [view](https://developers.arcgis.com/javascript/latest/references/core/widgets/Search/#view) specified by the Search widget instance. There are two types of sources:
   *
   * * [LayerSearchSource](https://developers.arcgis.com/javascript/latest/references/core/widgets/Search/LayerSearchSource/)
   * * [LocatorSearchSource](https://developers.arcgis.com/javascript/latest/references/core/widgets/Search/LocatorSearchSource/)
   *
   * Any combination of these sources may be used
   * together in the same instance of the Search widget.
   *
   * > [!WARNING]
   * >
   * > Feature layers created from client-side graphics are not supported.
   *
   * @example
   * // Default sources[] when sources is not specified
   * [
   *   {
   *     url: "https://geocode-api.arcgis.com/arcgis/rest/services/World/GeocodeServer",
   *     singleLineFieldName: "SingleLine",
   *     outFields: ["Addr_type"],
   *     name: "ArcGIS World Geocoding Service",
   *     placeholder: "Address",
   *     resultSymbol: {
   *        type: "picture-marker",  // autocasts as new PictureMarkerSymbol()
   *        url: this.basePath + "/images/search/search-symbol-32.png",
   *        size: 24,
   *        width: 24,
   *        height: 24,
   *        xoffset: 0,
   *        yoffset: 0
   *    }
   *   }
   * ]
   * @example
   * // Example of multiple sources[]
   * const sources = [
   * {
   *   url: "https://geocode-api.arcgis.com/arcgis/rest/services/World/GeocodeServer",
   *   singleLineFieldName: "SingleLine",
   *   name: "Custom Geocoding Service",
   *   placeholder: "Search Geocoder",
   *   maxResults: 3,
   *   maxSuggestions: 6,
   *   suggestionsEnabled: false,
   *   minSuggestCharacters: 0
   * }, {
   *   layer: new FeatureLayer({
   *     url: "https://services.arcgis.com/DO4gTjwJVIJ7O9Ca/arcgis/rest/services/GeoForm_Survey_v11_live/FeatureServer/0",
   *     outFields: ["*"]
   *   }),
   *   searchFields: ["Email", "URL"],
   *   displayField: "Email",
   *   exactMatch: false,
   *   outFields: ["*"],
   *   name: "Point FS",
   *   placeholder: "example: esri",
   *   maxResults: 6,
   *   maxSuggestions: 6,
   *   suggestionsEnabled: true,
   *   minSuggestCharacters: 0
   * },
   * {
   *   layer: new FeatureLayer({
   *     outFields: ["*"]
   *   }),
   *   placeholder: "esri",
   *   name: "A FeatureLayer",
   *   prefix: "",
   *   suffix: "",
   *   maxResults: 1,
   *   maxSuggestions: 6,
   *   exactMatch: false,
   *   searchFields: [], // defaults to FeatureLayer.displayField
   *   displayField: "", // defaults to FeatureLayer.displayField
   *   minSuggestCharacters: 0
   * }
   * ];
   * @example
   * // Set source(s) on creation
   * const searchWidget = new Search({
   *   sources: []
   * });
   * @example
   * // Set source(s)
   * const searchWidget = new Search();
   * const sources = [{ ... }, { ... }, { ... }]; //array of sources
   * searchWidget.sources = sources;
   * @example
   * // Add to source(s)
   * const searchWidget = new Search();
   * searchWidget.sources.push({ ... });  //new source
   */
  sources?: ReadonlyArrayOrCollection<(LocatorSearchSourceProperties | LayerSearchSourceProperties)>;
  /**
   * The view model for this widget. This is a class that contains all the logic
   * (properties and methods) that controls this widget's behavior. See the
   * [SearchViewModel](https://developers.arcgis.com/javascript/latest/references/core/widgets/Search/SearchViewModel/) class to access
   * all properties and methods on the widget.
   */
  viewModel?: SearchViewModelProperties;
}

export type SearchActiveMenu = "none" | "suggestion" | "source" | "warning";

export interface SearchEvents extends SearchViewModelEvents {
  /**
   * Fires when the widget's text input loses focus.
   *
   * @example
   * const searchWidget = new Search();
   *
   * searchWidget.on("search-blur", function(event){
   *   console.log("Focus removed from search input textbox.");
   * });
   */
  "search-blur": void;
  /**
   * Fires when the widget's text input sets focus.
   *
   * @example
   * const searchWidget = new Search();
   *
   * searchWidget.on("search-focus", function(event){
   *   console.log("Search input textbox is focused.");
   * });
   */
  "search-focus": void;
}

/**
 * The Search widget provides a way to perform search operations on [locator service(s)](https://developers.arcgis.com/javascript/latest/references/core/rest/locator/),
 * [map](https://developers.arcgis.com/javascript/latest/references/core/layers/MapImageLayer/)/[feature](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/) service feature
 * layer(s), [SceneLayers](https://developers.arcgis.com/javascript/latest/references/core/layers/SceneLayer/) with an associated feature layer,
 * [BuildingComponentSublayer](https://developers.arcgis.com/javascript/latest/references/core/layers/buildingSublayers/BuildingComponentSublayer/) with an associated feature layer,
 * [GeoJSONLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/GeoJSONLayer/), [CSVLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/CSVLayer/), [OGCFeatureLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/OGCFeatureLayer/), and/or
 * [table(s)](https://developers.arcgis.com/javascript/latest/references/core/webdoc/applicationProperties/SearchTable/). If using a locator with a geocoding service, the
 * [findAddressCandidates](https://developers.arcgis.com/rest/geocode/api-reference/geocoding-find-address-candidates.htm)
 * operation is used, whereas [queries](https://developers.arcgis.com/javascript/latest/references/core/rest/support/Query/) are used on feature layers.
 *
 * By default, the Search widget uses the ArcGIS World Geocoding Service via this URL:
 * `https://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer`.
 * If a [global apiKey](https://developers.arcgis.com/javascript/latest/references/core/config/#Config-apiKey) is present, the Search widget uses this URL:
 * `https://geocode-api.arcgis.com/arcgis/rest/services/World/GeocodeServer`.
 * If an [LocatorSearchSource.apiKey](https://developers.arcgis.com/javascript/latest/references/core/widgets/Search/LocatorSearchSource/#apiKey) is present on the
 * [LocatorSearchSource](https://developers.arcgis.com/javascript/latest/references/core/widgets/Search/LocatorSearchSource/),
 * then the Search widget uses the URL defined by the [LocatorSearchSource.url](https://developers.arcgis.com/javascript/latest/references/core/widgets/Search/LocatorSearchSource/#url)
 * property.
 *
 * The Search widget sets the view on the [Search result](https://developers.arcgis.com/javascript/latest/references/core/widgets/Search/types/#SearchResult). The level of detail (LOD)
 * at the center of the view depends on the data source, with higher quality data sources returning extents closer to the
 * `feature` obtained from the search. To manually define the scale of the view at the Search result, use the `zoomScale` property
 * of the [LocatorSearchSource.zoomScale](https://developers.arcgis.com/javascript/latest/references/core/widgets/Search/LocatorSearchSource/#zoomScale)
 * or [LayerSearchSource.zoomScale](https://developers.arcgis.com/javascript/latest/references/core/widgets/Search/LayerSearchSource/#zoomScale).
 *
 * Search widget results are typically sorted according to their relevance to the search and their relative importance.
 * However, when the scale of the [MapView.scale](https://developers.arcgis.com/javascript/latest/references/core/views/MapView/#scale) or
 * [SceneView.scale](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/#scale) is less than or equal to 300,000, the operations
 * support prioritization of candidates based on their distance from a specified point (the center of the view)
 * by passing in the `location` parameter. Features closest to the input location show up higher in the list of results.
 * This behavior can be changed by using the [LocatorSearchSource.localSearchDisabled](https://developers.arcgis.com/javascript/latest/references/core/widgets/Search/LocatorSearchSource/#localSearchDisabled)
 * property.
 *
 * ![search](https://developers.arcgis.com/javascript/latest/assets/references/core/widgets/search.avif)
 *
 * You can use the view's [DefaultUI](https://developers.arcgis.com/javascript/latest/references/core/views/ui/DefaultUI/) to add widgets to the view's user interface via the
 * `ui` property on the view. See the example below.
 *
 * @deprecated since version 4.33. Use the [Search component](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-search/) instead. For information on widget deprecation, read about [Esri's move to web components](https://developers.arcgis.com/javascript/latest/components-transition-plan/).
 * @since 4.0
 * @see [SearchViewModel](https://developers.arcgis.com/javascript/latest/references/core/widgets/Search/SearchViewModel/)
 * @see [SearchSource](https://developers.arcgis.com/javascript/latest/references/core/widgets/Search/SearchSource/)
 * @see [locator](https://developers.arcgis.com/javascript/latest/references/core/rest/locator/)
 * @see [DefaultUI](https://developers.arcgis.com/javascript/latest/references/core/views/ui/DefaultUI/)
 * @see [Sample - Search component with multiple sources](https://developers.arcgis.com/javascript/latest/sample-code/search-component-multisource/)
 * @see [Sample - Search component with custom source](https://developers.arcgis.com/javascript/latest/sample-code/search-component-customsource/)
 * @see [Proximity searches](https://developers.arcgis.com/rest/geocode/api-reference/geocoding-find-address-candidates.htm#ESRI_SECTION1_6B80D672B3F74F4697212696D890CFE1)
 * @example
 * const searchWidget = new Search({
 *   view: view
 * });
 * // Adds the search widget below other elements in
 * // the top left corner of the view
 * view.ui.add(searchWidget, {
 *   position: "top-left",
 *   index: 2
 * });
 */
export default class Search extends Widget {
  /**
   * @deprecated
   * Do not directly reference this property.
   * Use EventNames and EventTypes helpers from \@arcgis/core/Evented
   */
  "@eventTypes": SearchEvents;
  /**
   * @example
   * // typical usage
   * const searchWidget = new Search({
   *   view: view,
   *   sources: [ ... ]
   * });
   */
  constructor(properties?: SearchProperties);
  /**
   * The current active menu of the Search widget.
   *
   * @default "none"
   */
  accessor activeMenu: SearchActiveMenu;
  /**
   * The [source](https://developers.arcgis.com/javascript/latest/references/core/widgets/Search/#sources) object currently selected. Can be either a
   * [LayerSearchSource](https://developers.arcgis.com/javascript/latest/references/core/widgets/Search/LayerSearchSource/) or a [LocatorSearchSource](https://developers.arcgis.com/javascript/latest/references/core/widgets/Search/LocatorSearchSource/).
   */
  get activeSource(): SupportedSearchSource | null | undefined;
  /**
   * The selected source's index. This value is `-1` when all sources are selected.
   *
   * @default 0
   */
  accessor activeSourceIndex: number;
  /**
   * String value used as a hint for input text when searching on multiple sources. See
   * the image below to view the location and style of this text in the context of the widget.
   *
   * ![search-allPlaceholder](https://developers.arcgis.com/javascript/latest/assets/references/core/widgets/search-allplaceholder.avif)
   *
   * @default "Find address or place"
   */
  accessor allPlaceholder: string | null | undefined;
  /**
   * The combined collection of [SearchViewModel.defaultSources](https://developers.arcgis.com/javascript/latest/references/core/widgets/Search/SearchViewModel/#defaultSources)
   * and [SearchViewModel.sources](https://developers.arcgis.com/javascript/latest/references/core/widgets/Search/SearchViewModel/#sources).
   * The [SearchViewModel.defaultSources](https://developers.arcgis.com/javascript/latest/references/core/widgets/Search/SearchViewModel/#defaultSources)
   * displays first in the Search UI.
   *
   * @since 4.8
   */
  get allSources(): Collection<SupportedSearchSource>;
  /**
   * Indicates whether to automatically navigate to the selected result once selected.
   *
   * @default true
   * @since 4.32
   */
  accessor autoNavigate: boolean;
  /**
   * Indicates whether to automatically select and zoom to the first geocoded result. If `false`, the
   * [findAddressCandidates](https://developers.arcgis.com/rest/geocode/api-reference/geocoding-find-address-candidates.htm)
   * operation will still geocode the input string, but the top result will not be selected. To work with the
   * geocoded results, you can set up a [@search-complete](https://developers.arcgis.com/javascript/latest/references/core/widgets/Search/#event-search-complete) event handler and get the results
   * through the event object.
   *
   * @default true
   */
  accessor autoSelect: boolean;
  /**
   * A read-only property that is a [Collection](https://developers.arcgis.com/javascript/latest/references/core/core/Collection/)
   * of [LayerSearchSource](https://developers.arcgis.com/javascript/latest/references/core/widgets/Search/LayerSearchSource/)
   * and/or [LocatorSearchSource](https://developers.arcgis.com/javascript/latest/references/core/widgets/Search/LocatorSearchSource/). This property
   * may contain [ArcGIS Portal](https://enterprise.arcgis.com/en/portal/)
   * [locators](https://doc.esri.com/en/arcgis-enterprise/latest/administer/geocode-services.html)
   * and any web map or web scene [configurable search sources](https://doc.arcgis.com/en/arcgis-online/create-maps/configure-feature-search.htm).
   * Web maps or web scenes may contain
   * [map](https://developers.arcgis.com/javascript/latest/references/core/layers/MapImageLayer/)/[feature](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/) service feature
   * layer(s), and/or [table(s)](https://developers.arcgis.com/javascript/latest/references/core/webdoc/applicationProperties/SearchTable/) as sources.
   *
   * This property is used to populate the Search UI if the [SearchViewModel.sources](https://developers.arcgis.com/javascript/latest/references/core/widgets/Search/SearchViewModel/#sources) property is not set.
   *
   * @since 4.8
   */
  get defaultSources(): Collection<SupportedSearchSource>;
  /**
   * When true, the widget is visually withdrawn and cannot be interacted with.
   *
   * @default false
   * @since 4.15
   */
  accessor disabled: boolean;
  /**
   * This function provides the ability to override either the
   * [MapView goTo()](https://developers.arcgis.com/javascript/latest/references/core/views/MapView/#goTo) or
   * [SceneView goTo()](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/#goTo) methods.
   *
   * @since 4.8
   * @see [MapView.goTo()](https://developers.arcgis.com/javascript/latest/references/core/views/MapView/#goTo)
   * @see [SceneView.goTo()](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/#goTo)
   * @example
   * // The following snippet uses Search but can be applied to any
   * // widgets that support the goToOverride property.
   * search.goToOverride = function(view, goToParams) {
   *   goToParams.options = {
   *     duration: updatedDuration
   *   };
   *   return view.goTo(goToParams.target, goToParams.options);
   * };
   */
  accessor goToOverride: GoToOverride | null | undefined;
  /**
   * Icon which represents the widget. It is typically used when the widget is controlled by another
   * one (e.g. in the Expand widget).
   *
   * @default "search"
   * @since 4.27
   * @see [Calcite Icon Search](https://developers.arcgis.com/calcite-design-system/icons/)
   * @see [Calcite Icon Search](https://developers.arcgis.com/calcite-design-system/icons/)
   */
  get icon(): Icon["icon"];
  set icon(value: Icon["icon"] | null | undefined);
  /**
   * Indicates whether or not to include [SearchViewModel.defaultSources](https://developers.arcgis.com/javascript/latest/references/core/widgets/Search/SearchViewModel/#defaultSources) in the Search UI.
   * This can be a boolean value or a function that returns an array of Search [SearchViewModel.sources](https://developers.arcgis.com/javascript/latest/references/core/widgets/Search/SearchViewModel/#sources).
   *
   * @default true
   * @since 4.8
   * @example
   * // includeDefaultSources passed as a boolean value
   * const searchWidget = new Search({
   *   view: view,
   *   sources: [customSearchSource],
   *   includeDefaultSources: false
   * });
   *
   * // includeDefaultSources passed as a function
   * const searchWidget = new Search({
   *   view: view,
   *   sources: [customSearchSource],
   *   includeDefaultSources: function(sourcesResponse) {
   *     return sourcesResponse.defaultSources;
   *   }
   * });
   */
  accessor includeDefaultSources: boolean | SourcesHandler;
  /**
   * The widget's default label.
   *
   * @since 4.7
   */
  get label(): string;
  set label(value: string | null | undefined);
  /**
   * Enables location services within the widget.
   *
   * ![locationEnabled](https://developers.arcgis.com/javascript/latest/assets/references/core/widgets/search-locationEnabled.avif)
   *
   * > [!WARNING]
   * >
   * > The use of this property is only supported on secure origins.
   * > To use it, switch your application to a secure origin, such as HTTPS.
   * > Note that localhost is considered "potentially secure" and can be used for easy testing in browsers that supports
   * > [Window.isSecureContext](https://developer.mozilla.org/docs/Web/API/isSecureContext#browser_compatibility)
   * > (currently Chrome and Firefox).
   *
   * @default true
   * @since 4.6
   */
  accessor locationEnabled: boolean;
  /**
   * The maximum number of results returned by the widget if not specified by the source.
   *
   * @default 6
   */
  accessor maxResults: number;
  /**
   * The maximum number of suggestions returned by the widget if not specified by the source.
   *
   * If working with the default
   * [ArcGIS Online Geocoding service](https://developers.arcgis.com/rest/geocode/api-reference/overview-world-geocoding-service.htm),
   * the default remains at `5`.
   *
   * @default 6
   */
  accessor maxSuggestions: number;
  /**
   * Indicates the minimum number of characters required before querying for a suggestion.
   *
   * @default 3
   */
  accessor minSuggestCharacters: number;
  /**
   * Indicates whether to display a [Popup](https://developers.arcgis.com/javascript/latest/references/core/widgets/Popup/) when a selected result is clicked.
   *
   * @default true
   */
  accessor popupEnabled: boolean;
  /**
   * A customized [PopupTemplate](https://developers.arcgis.com/javascript/latest/references/core/PopupTemplate/) for the selected feature.
   * Note that any [templates](https://developers.arcgis.com/javascript/latest/references/core/PopupTemplate/)
   * defined on [allSources](https://developers.arcgis.com/javascript/latest/references/core/widgets/Search/#allSources) take precedence over those defined directly on the template.
   */
  get popupTemplate(): PopupTemplate | null | undefined;
  set popupTemplate(value: PopupTemplateProperties | null | undefined);
  /**
   * It is possible to search a specified portal instance's [locator services](https://doc.esri.com/en/arcgis-enterprise/latest/administer/configure-portal-to-geocode-addresses.html)
   * Use this property to set this [ArcGIS Portal](https://enterprise.arcgis.com/en/portal/) instance to search.
   *
   * @since 4.8
   */
  get portal(): Portal | null | undefined;
  set portal(value: PortalProperties | null | undefined);
  /**
   * The graphic used to highlight the resulting feature or location.
   *
   * > [!CAUTION]
   * >
   * > A graphic will be placed in the View's
   * > [View.graphics](https://developers.arcgis.com/javascript/latest/references/core/views/View/#graphics)
   * > for [layer views](https://developers.arcgis.com/javascript/latest/references/core/views/layers/LayerView/)
   * > that do not support the `highlight` method.
   */
  accessor resultGraphic: Graphic | null | undefined;
  /**
   * Indicates if the [resultGraphic](https://developers.arcgis.com/javascript/latest/references/core/widgets/Search/#resultGraphic) will display at the
   * location of the selected feature.
   *
   * @default true
   */
  accessor resultGraphicEnabled: boolean;
  /** An array of objects, each containing a [SearchResult](https://developers.arcgis.com/javascript/latest/references/core/widgets/Search/types/#SearchResult) from the search. */
  get results(): BaseSearchResults<SearchResult>[] | null | undefined;
  /**
   * Indicates whether to display the option to search all sources. When `true`, the "All" option
   * is displayed by default:
   *
   * ![search-searchAllEnabled-true](https://developers.arcgis.com/javascript/latest/assets/references/core/widgets/search-enablesearchingall-true.avif)
   *
   * When `false`, no option to search all sources at once is available:
   *
   * ![search-searchAllEnabled-false](https://developers.arcgis.com/javascript/latest/assets/references/core/widgets/search-enablesearchingall-false.avif)
   *
   * @default true
   */
  accessor searchAllEnabled: boolean;
  /** The value of the search box input text string. */
  accessor searchTerm: string;
  /**
   * The result selected from a search.
   *
   * @see [Event: select-result](https://developers.arcgis.com/javascript/latest/references/core/widgets/Search/#event-select-result)
   * @see [SearchViewModel.select()](https://developers.arcgis.com/javascript/latest/references/core/widgets/Search/SearchViewModel/#select)
   */
  get selectedResult(): SearchResult | null | undefined;
  /**
   * The Search widget may be used to search features in a
   * [map](https://developers.arcgis.com/javascript/latest/references/core/layers/MapImageLayer/)/[feature](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/) service feature
   * layer(s), [SceneLayers](https://developers.arcgis.com/javascript/latest/references/core/layers/SceneLayer/) with an associated feature layer,
   * [BuildingComponentSublayer](https://developers.arcgis.com/javascript/latest/references/core/layers/buildingSublayers/BuildingComponentSublayer/) with an associated feature layer,
   * [GeoJSONLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/GeoJSONLayer/), [CSVLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/CSVLayer/) or
   * [OGCFeatureLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/OGCFeatureLayer/), or [table](https://developers.arcgis.com/javascript/latest/references/core/webdoc/applicationProperties/SearchTable/),
   * or geocode locations with a [locator](https://developers.arcgis.com/javascript/latest/references/core/rest/locator/). The `sources` property defines the sources from which
   * to search for the [view](https://developers.arcgis.com/javascript/latest/references/core/widgets/Search/#view) specified by the Search widget instance. There are two types of sources:
   *
   * * [LayerSearchSource](https://developers.arcgis.com/javascript/latest/references/core/widgets/Search/LayerSearchSource/)
   * * [LocatorSearchSource](https://developers.arcgis.com/javascript/latest/references/core/widgets/Search/LocatorSearchSource/)
   *
   * Any combination of these sources may be used
   * together in the same instance of the Search widget.
   *
   * > [!WARNING]
   * >
   * > Feature layers created from client-side graphics are not supported.
   *
   * @example
   * // Default sources[] when sources is not specified
   * [
   *   {
   *     url: "https://geocode-api.arcgis.com/arcgis/rest/services/World/GeocodeServer",
   *     singleLineFieldName: "SingleLine",
   *     outFields: ["Addr_type"],
   *     name: "ArcGIS World Geocoding Service",
   *     placeholder: "Address",
   *     resultSymbol: {
   *        type: "picture-marker",  // autocasts as new PictureMarkerSymbol()
   *        url: this.basePath + "/images/search/search-symbol-32.png",
   *        size: 24,
   *        width: 24,
   *        height: 24,
   *        xoffset: 0,
   *        yoffset: 0
   *    }
   *   }
   * ]
   * @example
   * // Example of multiple sources[]
   * const sources = [
   * {
   *   url: "https://geocode-api.arcgis.com/arcgis/rest/services/World/GeocodeServer",
   *   singleLineFieldName: "SingleLine",
   *   name: "Custom Geocoding Service",
   *   placeholder: "Search Geocoder",
   *   maxResults: 3,
   *   maxSuggestions: 6,
   *   suggestionsEnabled: false,
   *   minSuggestCharacters: 0
   * }, {
   *   layer: new FeatureLayer({
   *     url: "https://services.arcgis.com/DO4gTjwJVIJ7O9Ca/arcgis/rest/services/GeoForm_Survey_v11_live/FeatureServer/0",
   *     outFields: ["*"]
   *   }),
   *   searchFields: ["Email", "URL"],
   *   displayField: "Email",
   *   exactMatch: false,
   *   outFields: ["*"],
   *   name: "Point FS",
   *   placeholder: "example: esri",
   *   maxResults: 6,
   *   maxSuggestions: 6,
   *   suggestionsEnabled: true,
   *   minSuggestCharacters: 0
   * },
   * {
   *   layer: new FeatureLayer({
   *     outFields: ["*"]
   *   }),
   *   placeholder: "esri",
   *   name: "A FeatureLayer",
   *   prefix: "",
   *   suffix: "",
   *   maxResults: 1,
   *   maxSuggestions: 6,
   *   exactMatch: false,
   *   searchFields: [], // defaults to FeatureLayer.displayField
   *   displayField: "", // defaults to FeatureLayer.displayField
   *   minSuggestCharacters: 0
   * }
   * ];
   * @example
   * // Set source(s) on creation
   * const searchWidget = new Search({
   *   sources: []
   * });
   * @example
   * // Set source(s)
   * const searchWidget = new Search();
   * const sources = [{ ... }, { ... }, { ... }]; //array of sources
   * searchWidget.sources = sources;
   * @example
   * // Add to source(s)
   * const searchWidget = new Search();
   * searchWidget.sources.push({ ... });  //new source
   */
  get sources(): SearchViewModel["sources"];
  set sources(value: ReadonlyArrayOrCollection<(LocatorSearchSourceProperties | LayerSearchSourceProperties)>);
  /**
   * An array of results from the [suggest method](https://developers.arcgis.com/javascript/latest/references/core/widgets/Search/#suggest).
   *
   * This is available if working with a 10.3 or greater geocoding service that has
   * [suggest capability loaded](https://developers.arcgis.com/rest/geocode/api-reference/geocoding-suggest.htm) or a
   * 10.3 or greater feature layer that supports pagination, i.e. `supportsPagination = true`.
   */
  get suggestions(): SearchViewModel["suggestions"];
  /**
   * Enable suggestions for the widget.
   *
   * This is only available if working with a 10.3 or greater geocoding service that has [suggest capability
   * loaded](https://developers.arcgis.com/rest/geocode/api-reference/geocoding-suggest.htm) or a 10.3 or greater feature layer that supports pagination, i.e. `supportsPagination = true`.
   *
   * @default true
   */
  accessor suggestionsEnabled: boolean;
  /** A reference to the [MapView](https://developers.arcgis.com/javascript/latest/references/core/views/MapView/) or [SceneView](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/). Set this to link the widget to a specific view. */
  accessor view: MapViewOrSceneView | null | undefined;
  /**
   * The view model for this widget. This is a class that contains all the logic
   * (properties and methods) that controls this widget's behavior. See the
   * [SearchViewModel](https://developers.arcgis.com/javascript/latest/references/core/widgets/Search/SearchViewModel/) class to access
   * all properties and methods on the widget.
   */
  get viewModel(): SearchViewModel;
  set viewModel(value: SearchViewModelProperties);
  /** Unfocuses the widget's text input. */
  blur(): void;
  /**
   * Clears the current searchTerm, search results, suggest results, graphic, and graphics layer.
   * It also hides any open menus.
   */
  clear(): void;
  /** Brings focus to the widget's text input. */
  focus(): void;
  /**
   * Depending on the sources specified, search() queries the feature layer(s) and/or performs
   * address matching using any specified [locator(s)](https://developers.arcgis.com/javascript/latest/references/core/rest/locator/) and
   * returns any applicable results.
   *
   * @param searchTerm - This searchTerm can be
   *        a string, geometry, suggest candidate object, or an array of [longitude,latitude] coordinate pairs.
   *        If a geometry is supplied, then it will reverse geocode (locator) or
   *        findAddressCandidates with geometry instead of text.
   * @returns When resolved, returns a [SearchResponse](https://developers.arcgis.com/javascript/latest/references/core/widgets/Search/types/#SearchResponse) containing a
   *                   [SearchResult](https://developers.arcgis.com/javascript/latest/references/core/widgets/Search/types/#SearchResult).
   */
  search(searchTerm?: SearchItem | null | undefined): Promise<SearchResponse | null | undefined>;
  /**
   * Performs a suggest() request on the active Locator. It also uses the current value of
   * the widget or one that is passed in.
   *
   * Suggestions are available if working with a 10.3 or greater geocoding service that has
   * [suggest capability loaded](https://developers.arcgis.com/rest/geocode/api-reference/geocoding-suggest.htm)
   * or a 10.3 or greater feature layer that supports pagination, i.e. `supportsPagination = true`.
   *
   * @param query - The string value used to suggest() on an active Locator or feature layer. If
   *                         nothing is passed in, takes the current value of the widget.
   * @returns When resolved, returns [SuggestResponse](https://developers.arcgis.com/javascript/latest/references/core/widgets/Search/types/#SuggestResponse) containing an array of result objects. Each of these results contains a [SuggestResult](https://developers.arcgis.com/javascript/latest/references/core/widgets/Search/types/#SuggestResult).
   */
  suggest(query?: string): Promise<SuggestResponse | null | undefined>;
}