import type { JSONSupport } from "../../../core/JSONSupport.js";

export interface SnowyWeatherProperties extends Partial<Pick<SnowyWeather, "cloudCover" | "precipitation" | "snowCover">> {}

/**
 * The SnowyWeather class allows you to change the weather conditions in the scene to snowy weather.
 *
 * ![scene-atmosphere](https://developers.arcgis.com/javascript/latest/assets/references/core/views/scene-weather-snowy.avif)
 *
 * Example:
 * ```js
 * let view = new SceneView({
 *   container: "viewDiv",
 *
 *   map: new Map({
 *     basemap: "satellite",
 *     ground: "world-elevation"
 *   }),
 *   environment: {
 *     weather: {
 *       type: "snowy",
 *       cloudCover: 0.8,
 *       precipitation: 0.3,
 *       snowCover: "enabled"   // autocasts as new SnowyWeather({ cloudCover: 0.8, precipitation: 0.3, snowCover: "enabled" })
 *     }
 *   }
 * });
 * ```
 * The weather visualization updates as soon as the property changes:
 * ```
 * view.environment.weather = {
 *    type: "snowy",
 *    cloudCover: 0.4,
 *    precipitation: 0.3   // autocasts as new SnowyWeather({ cloudCover: 0.4, precipitation: 0.3, snowCover: "disabled" })
 * }
 * ```
 *
 * @since 4.24
 * @see [Sample - Weather visualization](https://developers.arcgis.com/javascript/latest/sample-code/scene-weather/)
 * @see [Sample - Weather component](https://developers.arcgis.com/javascript/latest/sample-code/weather/)
 */
export default class SnowyWeather extends JSONSupport {
  constructor(properties?: SnowyWeatherProperties);
  /**
   * Specifies the amount of cloud cover in the sky for a certain weather type.
   *
   * @default 0.5
   */
  accessor cloudCover: number;
  /**
   * Specifies the amount of falling snow.
   *
   * @default 0.5
   */
  accessor precipitation: number;
  /**
   * Display surfaces covered with snow. The snow cover does not display on draped or tiled layers.
   *
   * @default "disabled"
   */
  accessor snowCover: "enabled" | "disabled";
  /** The type of Weather */
  get type(): "snowy";
  /**
   * Creates a deep clone of this object.
   *
   * @returns Creates a new clone of the instance calling this method.
   */
  clone(): SnowyWeather;
}