import type Collection from "../../core/Collection.js";
import type SearchLayer from "./SearchLayer.js";
import type SearchTable from "./SearchTable.js";
import type { JSONSupport, JSONSupportMixinProperties } from "../../core/JSONSupport.js";
import type { SearchLayerProperties } from "./SearchLayer.js";
import type { ReadonlyArrayOrCollection } from "../../core/Collection.js";
import type { SearchTableProperties } from "./SearchTable.js";

export interface SearchProperties extends JSONSupportMixinProperties, Partial<Pick<Search, "addressSearchEnabled" | "enabled" | "hintText">> {
  /** A collection of layers to be included in search. */
  layers?: ReadonlyArrayOrCollection<SearchLayerProperties>;
  /** A collection of tables to be included in search. */
  tables?: ReadonlyArrayOrCollection<SearchTableProperties>;
}

/**
 * Represents the search parameters set within the web scene or the web map.
 *
 * @since 4.7
 */
export default class Search extends JSONSupport {
  constructor(properties?: SearchProperties);
  /**
   * Indicates whether the place finder is enabled in the web scene or the web map.
   *
   * @default true
   * @since 4.14
   */
  accessor addressSearchEnabled: boolean;
  /**
   * Whether search functionality is enabled in the web scene or the web map.
   *
   * @default true
   */
  accessor enabled: boolean;
  /** The hint provided with the search dialog. */
  accessor hintText: string | null | undefined;
  /** A collection of layers to be included in search. */
  get layers(): Collection<SearchLayer>;
  set layers(value: ReadonlyArrayOrCollection<SearchLayerProperties>);
  /** A collection of tables to be included in search. */
  get tables(): Collection<SearchTable>;
  set tables(value: ReadonlyArrayOrCollection<SearchTableProperties>);
  /**
   * Creates a deep clone of this object.
   *
   * @returns Creates a deep clone of the instance calling this method.
   */
  clone(): Search;
}