import type FeatureEffect from "../support/FeatureEffect.js";
import type { FeatureEffectProperties } from "../support/FeatureEffect.js";

export interface FeatureEffectLayerProperties {
  /**
   * The featureEffect can be used to draw attention to features of interest.
   * It allows for the selection of features via a
   * [filter](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-support-FeatureEffect.html#filter), and an
   * [includedEffect](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-support-FeatureEffect.html#includedEffect) and
   * [excludedEffect](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-support-FeatureEffect.html#excludedEffect)
   * are applied to those features that respectively pass or fail the filter requirements.
   *
   * > **Notes**
   * >
   * > - Set the [effect](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-mixins-BlendLayer.html#effect) property if the effect needs to be applied to the entire layer.
   * > - If the `featureEffect` is set on the layer, it will be inherited by `layerView.featureEffect` unless the developer overrides it on the layer view. The `layerView.featureEffect`
   * > will take precedence over `layer.featureEffect` if both properties are set.
   * > - If all of the following four properties are applied, then they will be applied in this order: [featureEffect](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-mixins-FeatureEffectLayer.html#featureEffect),
   * > [effect](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-mixins-BlendLayer.html#effect), [opacity](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-Layer.html#opacity) and [blendMode](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-mixins-BlendLayer.html#blendMode).
   *
   * > [!WARNING]
   * >
   * > **Known Limitations**
   * >
   * > FeatureEffect is not supported in the following scenarios:
   * > * In 3D [SceneViews](https://developers.arcgis.com/javascript/latest/api-reference/esri-views-SceneView.html)
   * > * When [FeatureReductionCluster](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-FeatureLayer.html#featureReduction) is enabled
   * > * See [print](https://developers.arcgis.com/javascript/latest/api-reference/esri-rest-print.html) for known printing limitations.
   *
   * @since 4.22
   * @see [Sample - Apply effects to features](https://developers.arcgis.com/javascript/latest/sample-code/featureeffect-geometry/)
   * @see [Sample - Apply drop-shadow effect to a layerView](https://developers.arcgis.com/javascript/latest/sample-code/featureeffect-drop-shadow/)
   * @see [Layer effect](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-mixins-BlendLayer.html#effect)
   * @example
   * // gray out features that fall outside of the 3 mile buffer of the mouse's location
   * // by setting feature effect on excluded features
   * layer.featureEffect = new FeatureEffect({
   *   filter: new FeatureFilter({
   *     geometry: filterGeometry,
   *     spatialRelationship: "intersects",
   *     distance: 3,
   *     units: "miles"
   *   }),
   *   excludedEffect: "grayscale(100%) opacity(30%)"
   * });
   * @example
   * // Apply a drop-shadow feature effect to the features that intersect the borough boundaries,
   * // while applying blur and brightness effects to the features that are excluded from filter criteria.
   * // The resulting map will make it easier to spot if the residents are more likely to experience deprivation
   * // if they live on a borough boundary.
   * const featureFilter = new FeatureFilter({
   *   where: "BoroughEdge='true'"
   * });
   * layer.featureEffect = new FeatureEffect({
   *   filter: featureFilter,
   *   includedEffect: "drop-shadow(3px, 3px, 3px, black)",
   *   excludedEffect: "blur(1px) brightness(65%)"
   * });
   */
  featureEffect?: FeatureEffectProperties | null;
}

/**
 * FeatureEffectLayer is a mixin that adds [featureEffect](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-mixins-FeatureEffectLayer.html#featureEffect) properties to a layer.
 *
 * @since 4.22
 */
export abstract class FeatureEffectLayer {
  constructor(...args: any[]);
  /**
   * The featureEffect can be used to draw attention to features of interest.
   * It allows for the selection of features via a
   * [filter](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-support-FeatureEffect.html#filter), and an
   * [includedEffect](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-support-FeatureEffect.html#includedEffect) and
   * [excludedEffect](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-support-FeatureEffect.html#excludedEffect)
   * are applied to those features that respectively pass or fail the filter requirements.
   *
   * > **Notes**
   * >
   * > - Set the [effect](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-mixins-BlendLayer.html#effect) property if the effect needs to be applied to the entire layer.
   * > - If the `featureEffect` is set on the layer, it will be inherited by `layerView.featureEffect` unless the developer overrides it on the layer view. The `layerView.featureEffect`
   * > will take precedence over `layer.featureEffect` if both properties are set.
   * > - If all of the following four properties are applied, then they will be applied in this order: [featureEffect](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-mixins-FeatureEffectLayer.html#featureEffect),
   * > [effect](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-mixins-BlendLayer.html#effect), [opacity](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-Layer.html#opacity) and [blendMode](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-mixins-BlendLayer.html#blendMode).
   *
   * > [!WARNING]
   * >
   * > **Known Limitations**
   * >
   * > FeatureEffect is not supported in the following scenarios:
   * > * In 3D [SceneViews](https://developers.arcgis.com/javascript/latest/api-reference/esri-views-SceneView.html)
   * > * When [FeatureReductionCluster](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-FeatureLayer.html#featureReduction) is enabled
   * > * See [print](https://developers.arcgis.com/javascript/latest/api-reference/esri-rest-print.html) for known printing limitations.
   *
   * @since 4.22
   * @see [Sample - Apply effects to features](https://developers.arcgis.com/javascript/latest/sample-code/featureeffect-geometry/)
   * @see [Sample - Apply drop-shadow effect to a layerView](https://developers.arcgis.com/javascript/latest/sample-code/featureeffect-drop-shadow/)
   * @see [Layer effect](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-mixins-BlendLayer.html#effect)
   * @example
   * // gray out features that fall outside of the 3 mile buffer of the mouse's location
   * // by setting feature effect on excluded features
   * layer.featureEffect = new FeatureEffect({
   *   filter: new FeatureFilter({
   *     geometry: filterGeometry,
   *     spatialRelationship: "intersects",
   *     distance: 3,
   *     units: "miles"
   *   }),
   *   excludedEffect: "grayscale(100%) opacity(30%)"
   * });
   * @example
   * // Apply a drop-shadow feature effect to the features that intersect the borough boundaries,
   * // while applying blur and brightness effects to the features that are excluded from filter criteria.
   * // The resulting map will make it easier to spot if the residents are more likely to experience deprivation
   * // if they live on a borough boundary.
   * const featureFilter = new FeatureFilter({
   *   where: "BoroughEdge='true'"
   * });
   * layer.featureEffect = new FeatureEffect({
   *   filter: featureFilter,
   *   includedEffect: "drop-shadow(3px, 3px, 3px, black)",
   *   excludedEffect: "blur(1px) brightness(65%)"
   * });
   */
  get featureEffect(): FeatureEffect | null | undefined;
  set featureEffect(value: FeatureEffectProperties | null | undefined);
}