import type Accessor from "../../../core/Accessor.js";
import type BuildingSceneLayer from "../../../layers/BuildingSceneLayer.js";
import type CSVLayer from "../../../layers/CSVLayer.js";
import type FeatureLayer from "../../../layers/FeatureLayer.js";
import type GeoJSONLayer from "../../../layers/GeoJSONLayer.js";
import type GraphicsLayer from "../../../layers/GraphicsLayer.js";
import type MapNotesLayer from "../../../layers/MapNotesLayer.js";
import type SceneLayer from "../../../layers/SceneLayer.js";
import type WFSLayer from "../../../layers/WFSLayer.js";
import type SubtypeSublayer from "../../../layers/support/SubtypeSublayer.js";
import type { FeatureSnappingSupportedLayer } from "./types.js";

export interface FeatureSnappingLayerSourceProperties<T extends FeatureSnappingSupportedLayer = BuildingSceneLayer | CSVLayer | FeatureLayer | GeoJSONLayer | GraphicsLayer | MapNotesLayer | SceneLayer | SubtypeSublayer | WFSLayer> extends Partial<Pick<FeatureSnappingLayerSource<T>, "enabled">> {
  /**
   * The source layer used for snapping.
   *
   * @see [SnappingOptions](https://developers.arcgis.com/javascript/latest/references/core/views/interactive/snapping/SnappingOptions/)
   */
  layer?: T;
}

/**
 * The FeatureSnappingLayerSource specifies which layers will be utilized for snapping in the
 * [SnappingOptions](https://developers.arcgis.com/javascript/latest/references/core/views/interactive/snapping/SnappingOptions/).
 *
 * > [!WARNING]
 * >
 * > **Known Limitations**
 * >
 * > Layer types currently supported for snapping are: [FeatureLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/),
 * > [GraphicsLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/GraphicsLayer/) (except Mesh geometries), [GeoJSONLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/GeoJSONLayer/),
 * > [WFSLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/WFSLayer/), [CSVLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/CSVLayer/),
 * > [SubtypeSublayer](https://developers.arcgis.com/javascript/latest/references/core/layers/support/SubtypeSublayer/) (2D only), [MapNotesLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/MapNotesLayer/) (2D only),
 * > [3D Object SceneLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/SceneLayer/) (3D only), and [BuildingSceneLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/BuildingSceneLayer/) (3D only).
 *
 * @since 4.19
 * @see [SnappingOptions](https://developers.arcgis.com/javascript/latest/references/core/views/interactive/snapping/SnappingOptions/)
 * @example
 * // Create a new instance of Sketch, and set
 * // a layer for one of the featureSources property.
 * // This enables feature snapping on that layer.
 * const Sketch = new Sketch({
 *   layer: graphicsLayer,
 *   view: view,
 *   snappingOptions: { // autocasts to SnappingOptions()
 *     enabled: true, // global snapping is turned on
 *     // assigns a collection of FeatureSnappingLayerSource() and enables feature snapping on this layer
 *     featureSources: [{ layer: graphicsLayer, enabled: true }]
 *   }
 * });
 */
export default class FeatureSnappingLayerSource<T extends FeatureSnappingSupportedLayer = BuildingSceneLayer | CSVLayer | FeatureLayer | GeoJSONLayer | GraphicsLayer | MapNotesLayer | SceneLayer | SubtypeSublayer | WFSLayer> extends Accessor {
  constructor(properties?: FeatureSnappingLayerSourceProperties);
  /**
   * Indicates whether feature snapping is turned on or off.
   *
   * @default true
   */
  accessor enabled: boolean;
  /**
   * The source layer used for snapping.
   *
   * @see [SnappingOptions](https://developers.arcgis.com/javascript/latest/references/core/views/interactive/snapping/SnappingOptions/)
   */
  get layer(): T;
}