import type Layer from "../../layers/Layer.js";
import type Accessor from "../../core/Accessor.js";
import type Sublayer from "../../layers/support/Sublayer.js";
import type ScaleRanges from "./ScaleRanges.js";
import type SliderViewModel from "../Slider/SliderViewModel.js";
import type { MapViewOrSceneView } from "../../views/MapViewOrSceneView.js";
import type { SliderViewModelProperties } from "../Slider/SliderViewModel.js";

export interface ScaleRangeSliderViewModelProperties extends Partial<Pick<ScaleRangeSliderViewModel, "layer" | "maxScaleLimit" | "minScaleLimit" | "view">> {
  /**
   * The maximum scale of the active scale range. When the maxScale
   * reaches the [maxScaleLimit](https://developers.arcgis.com/javascript/latest/references/core/widgets/ScaleRangeSlider/ScaleRangeSliderViewModel/#maxScaleLimit), the maxScale
   * value becomes 0 and there is no maximum scale set.
   */
  maxScale?: number;
  /**
   * The minimum scale of the active scale range. When the minScale
   * reaches the [minScaleLimit](https://developers.arcgis.com/javascript/latest/references/core/widgets/ScaleRangeSlider/ScaleRangeSliderViewModel/#minScaleLimit), the minScale
   * value becomes 0 and there is no minimum scale set.
   */
  minScale?: number;
  /**
   * The [SliderViewModel][SliderViewModel](https://developers.arcgis.com/javascript/latest/references/core/widgets/Slider/SliderViewModel/)
   * for supporting the scale range slider widget.
   */
  sliderViewModel?: SliderViewModelProperties;
}

export type ScaleRangeSliderViewModelState = "disabled" | "ready";

/**
 * Provides the logic for the [ScaleRangeSlider](https://developers.arcgis.com/javascript/latest/references/core/widgets/ScaleRangeSlider/) widget and [component](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-scale-range-slider/).
 *
 * @since 4.13
 * @see [ScaleRangeSlider](https://developers.arcgis.com/javascript/latest/references/core/widgets/ScaleRangeSlider/) widget
 * @see [Scale Range Slider component](https://developers.arcgis.com/javascript/latest/references/map-components/components/arcgis-scale-range-slider/)
 * @see [ScaleRanges](https://developers.arcgis.com/javascript/latest/references/core/widgets/ScaleRangeSlider/ScaleRanges/)
 * @see [Programming patterns: Widget viewModel pattern](https://developers.arcgis.com/javascript/latest/programming-patterns/#widget-viewmodel-pattern)
 */
export default class ScaleRangeSliderViewModel extends Accessor {
  constructor(properties?: ScaleRangeSliderViewModelProperties);
  /**
   * When provided, the initial [minScale](https://developers.arcgis.com/javascript/latest/references/core/widgets/ScaleRangeSlider/ScaleRangeSliderViewModel/#minScale) and [maxScale](https://developers.arcgis.com/javascript/latest/references/core/widgets/ScaleRangeSlider/ScaleRangeSliderViewModel/#maxScale) values will match the layer's.
   *
   * When a tiled layer is used, the slider will be restricted from moving the slider thumbs past the `lods` of the layer's tiling scheme.
   * Since version 4.28, when a [MapImageLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/MapImageLayer/) is used, the slider will be restricted from moving past the min/max scale defined on the map service.
   * The unavailable scale range will be designated with a dashed line.
   */
  accessor layer: Layer | Sublayer | null | undefined;
  /**
   * The maximum scale of the active scale range. When the maxScale
   * reaches the [maxScaleLimit](https://developers.arcgis.com/javascript/latest/references/core/widgets/ScaleRangeSlider/ScaleRangeSliderViewModel/#maxScaleLimit), the maxScale
   * value becomes 0 and there is no maximum scale set.
   */
  get maxScale(): number;
  set maxScale(value: number | undefined);
  /** The lowest possible maximum scale value from the slider. */
  accessor maxScaleLimit: number;
  /**
   * The minimum scale of the active scale range. When the minScale
   * reaches the [minScaleLimit](https://developers.arcgis.com/javascript/latest/references/core/widgets/ScaleRangeSlider/ScaleRangeSliderViewModel/#minScaleLimit), the minScale
   * value becomes 0 and there is no minimum scale set.
   */
  get minScale(): number;
  set minScale(value: number | undefined);
  /** The highest possible minimum scale value from the slider. */
  accessor minScaleLimit: number;
  /** The valid scale ranges available based on the slider position. */
  get scaleRanges(): ReturnType<typeof ScaleRanges.fromScaleRange>;
  /**
   * The [SliderViewModel][SliderViewModel](https://developers.arcgis.com/javascript/latest/references/core/widgets/Slider/SliderViewModel/)
   * for supporting the scale range slider widget.
   */
  get sliderViewModel(): SliderViewModel;
  set sliderViewModel(value: SliderViewModelProperties);
  /**
   * The current state of the widget.
   *
   * @default "disabled"
   */
  get state(): ScaleRangeSliderViewModelState;
  /**
   * 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;
  /**
   * Utility method for converting scale-to-slider values.
   *
   * @param scale - The map scale to be converted.
   * @returns The value of the slider.
   */
  mapScaleToSlider(scale: number): number;
  /**
   * Utility method for converting slider-to-scale values.
   *
   * @param value - The value of the slider.
   * @returns The map scale that corresponds to the value of the slider.
   */
  mapSliderToScale(value: number): number;
}