import type SunLighting from "./SunLighting.js";
import type VirtualLighting from "./VirtualLighting.js";
import type Background from "./background/Background.js";
import type { JSONSupport, JSONSupportMixinProperties } from "../core/JSONSupport.js";
import type { WeatherUnion } from "../views/3d/environment/types.js";
import type { VirtualLightingProperties } from "./VirtualLighting.js";
import type { SunLightingProperties } from "./SunLighting.js";
import type { BackgroundProperties } from "./background/Background.js";
import type { FoggyWeatherProperties } from "../views/3d/environment/FoggyWeather.js";
import type { SnowyWeatherProperties } from "../views/3d/environment/SnowyWeather.js";
import type { RainyWeatherProperties } from "../views/3d/environment/RainyWeather.js";
import type { CloudyWeatherProperties } from "../views/3d/environment/CloudyWeather.js";
import type { SunnyWeatherProperties } from "../views/3d/environment/SunnyWeather.js";

export interface EnvironmentProperties extends JSONSupportMixinProperties, Partial<Pick<Environment, "atmosphereEnabled" | "starsEnabled">> {
  /**
   * Specifies how the background of the scene
   *            (which lies behind sky, stars and atmosphere) should be displayed.
   *            By default this is simply a single, fully opaque, black color. Currently
   *            [ColorBackground](https://developers.arcgis.com/javascript/latest/api-reference/esri-webscene-background-ColorBackground.html) is the only type of background supported.
   */
  background?: BackgroundProperties | null;
  /**
   * Settings for defining the lighting of the scene.
   * The lighting can be either "sun" or "virtual".
   */
  lighting?: (SunLightingProperties & { type?: "sun" }) | (VirtualLightingProperties & { type: "virtual" });
  /**
   * Indicates the type of weather visualization in the scene.
   * This setting does not have any effect in [local scenes](https://developers.arcgis.com/javascript/latest/api-reference/esri-views-SceneView.html#viewingMode).
   *
   *   Known Value | Example
   *   ------------|---------
   *   [SunnyWeather](https://developers.arcgis.com/javascript/latest/api-reference/esri-views-3d-environment-SunnyWeather.html) | ![scene-atmosphere](https://developers.arcgis.com/javascript/latest/assets/img/apiref/views/scene-weather-sunny.png)
   *   [CloudyWeather](https://developers.arcgis.com/javascript/latest/api-reference/esri-views-3d-environment-CloudyWeather.html) | ![scene-atmosphere](https://developers.arcgis.com/javascript/latest/assets/img/apiref/views/scene-weather-cloudy.png)
   *   [RainyWeather](https://developers.arcgis.com/javascript/latest/api-reference/esri-views-3d-environment-RainyWeather.html) | ![scene-atmosphere](https://developers.arcgis.com/javascript/latest/assets/img/apiref/views/scene-weather-rainy.png)
   *   [SnowyWeather](https://developers.arcgis.com/javascript/latest/api-reference/esri-views-3d-environment-SnowyWeather.html) | ![scene-atmosphere](https://developers.arcgis.com/javascript/latest/assets/img/apiref/views/scene-weather-snowy.png)
   *   [FoggyWeather](https://developers.arcgis.com/javascript/latest/api-reference/esri-views-3d-environment-FoggyWeather.html) | ![scene-atmosphere](https://developers.arcgis.com/javascript/latest/assets/img/apiref/views/scene-weather-foggy.png)
   *
   * @default SunnyWeather
   */
  weather?: ((SunnyWeatherProperties & { type: "sunny" }) | (CloudyWeatherProperties & { type: "cloudy" }) | (RainyWeatherProperties & { type: "rainy" }) | (SnowyWeatherProperties & { type: "snowy" }) | (FoggyWeatherProperties & { type: "foggy" }));
}

/**
 * Represents settings that affect the environment in
 * which the [WebScene](https://developers.arcgis.com/javascript/latest/api-reference/esri-WebScene.html) is displayed (such as lighting). It is part of the
 * [initial state](https://developers.arcgis.com/javascript/latest/api-reference/esri-WebScene.html#initialViewProperties) of the WebScene
 * as well as [Presentation#slides](https://developers.arcgis.com/javascript/latest/api-reference/esri-webscene-Presentation.html#slides) in the presentation.
 *
 * @since 4.0
 * @see [InitialViewProperties](https://developers.arcgis.com/javascript/latest/api-reference/esri-webscene-InitialViewProperties.html)
 * @see [Slide](https://developers.arcgis.com/javascript/latest/api-reference/esri-webscene-Slide.html)
 */
export default class Environment extends JSONSupport {
  constructor(properties?: EnvironmentProperties);
  /**
   * Indicates whether atmosphere visualization (haze, sky) is enabled. Disabling the atmosphere will also disable weather.
   *
   * @default true
   */
  accessor atmosphereEnabled: boolean;
  /**
   * Specifies how the background of the scene
   *            (which lies behind sky, stars and atmosphere) should be displayed.
   *            By default this is simply a single, fully opaque, black color. Currently
   *            [ColorBackground](https://developers.arcgis.com/javascript/latest/api-reference/esri-webscene-background-ColorBackground.html) is the only type of background supported.
   */
  get background(): Background | null | undefined;
  set background(value: BackgroundProperties | null | undefined);
  /**
   * Settings for defining the lighting of the scene.
   * The lighting can be either "sun" or "virtual".
   */
  get lighting(): SunLighting | VirtualLighting;
  set lighting(value: (SunLightingProperties & { type?: "sun" }) | (VirtualLightingProperties & { type: "virtual" }));
  /**
   * Indicates whether stars visualization is enabled.
   *
   * @default true
   */
  accessor starsEnabled: boolean;
  /**
   * Indicates the type of weather visualization in the scene.
   * This setting does not have any effect in [local scenes](https://developers.arcgis.com/javascript/latest/api-reference/esri-views-SceneView.html#viewingMode).
   *
   *   Known Value | Example
   *   ------------|---------
   *   [SunnyWeather](https://developers.arcgis.com/javascript/latest/api-reference/esri-views-3d-environment-SunnyWeather.html) | ![scene-atmosphere](https://developers.arcgis.com/javascript/latest/assets/img/apiref/views/scene-weather-sunny.png)
   *   [CloudyWeather](https://developers.arcgis.com/javascript/latest/api-reference/esri-views-3d-environment-CloudyWeather.html) | ![scene-atmosphere](https://developers.arcgis.com/javascript/latest/assets/img/apiref/views/scene-weather-cloudy.png)
   *   [RainyWeather](https://developers.arcgis.com/javascript/latest/api-reference/esri-views-3d-environment-RainyWeather.html) | ![scene-atmosphere](https://developers.arcgis.com/javascript/latest/assets/img/apiref/views/scene-weather-rainy.png)
   *   [SnowyWeather](https://developers.arcgis.com/javascript/latest/api-reference/esri-views-3d-environment-SnowyWeather.html) | ![scene-atmosphere](https://developers.arcgis.com/javascript/latest/assets/img/apiref/views/scene-weather-snowy.png)
   *   [FoggyWeather](https://developers.arcgis.com/javascript/latest/api-reference/esri-views-3d-environment-FoggyWeather.html) | ![scene-atmosphere](https://developers.arcgis.com/javascript/latest/assets/img/apiref/views/scene-weather-foggy.png)
   *
   * @default SunnyWeather
   */
  get weather(): WeatherUnion;
  set weather(value: ((SunnyWeatherProperties & { type: "sunny" }) | (CloudyWeatherProperties & { type: "cloudy" }) | (RainyWeatherProperties & { type: "rainy" }) | (SnowyWeatherProperties & { type: "snowy" }) | (FoggyWeatherProperties & { type: "foggy" })));
  /**
   * Creates a deep clone of this object.
   *
   * @returns Creates a deep clone of the instance calling this method.
   */
  clone(): Environment;
}