import type Collection from "../core/Collection.js";
import type FillSymbol3DLayer from "./FillSymbol3DLayer.js";
import type Symbol3D from "./Symbol3D.js";
import type { ReadonlyArrayOrCollection } from "../core/Collection.js";
import type { FillSymbol3DLayerProperties } from "./FillSymbol3DLayer.js";
import type { Symbol3DProperties } from "./Symbol3D.js";

export interface MeshSymbol3DProperties extends Symbol3DProperties {
  /**
   * A Collection of [Symbol3DLayer](https://developers.arcgis.com/javascript/latest/references/core/symbols/Symbol3DLayer/) objects
   * used to visualize the graphic or feature. Individual symbol layers
   * may be autocast as objects and specified using the `type` property.
   */
  symbolLayers?: ReadonlyArrayOrCollection<FillSymbol3DLayerProperties & { type: "fill"; }>;
}

/**
 * MeshSymbol3D is used to render 3D mesh features in a [SceneLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/SceneLayer/)
 * in a 3D [SceneView](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/). This symbol type is not supported in 2D
 * [MapViews](https://developers.arcgis.com/javascript/latest/references/core/views/MapView/).
 *
 * A MeshSymbol3D must include at least one [symbol layer](https://developers.arcgis.com/javascript/latest/references/core/symbols/MeshSymbol3D/#symbolLayers) for it to
 * render in the view. One or more of the following
 * [symbol layer](https://developers.arcgis.com/javascript/latest/references/core/symbols/Symbol3DLayer/) types may be used to define a 3D mesh symbol:
 *
 * [Symbol3DLayer](https://developers.arcgis.com/javascript/latest/references/core/symbols/Symbol3DLayer/) Type | Flat/Volumetric | Size Units | Example
 * ------------|-----------|------------|-----------
 * [FillSymbol3DLayer](https://developers.arcgis.com/javascript/latest/references/core/symbols/FillSymbol3DLayer/)| flat | - | ![s3d-fill](https://developers.arcgis.com/javascript/latest/assets/references/core/symbols/symbols3d-fill-solid.png)
 *
 * The image below depicts a [SceneLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/SceneLayer/) whose graphics
 * are styled with a MeshSymbol3D containing a [FillSymbol3DLayer](https://developers.arcgis.com/javascript/latest/references/core/symbols/FillSymbol3DLayer/).
 *
 * ![3d-mesh](https://developers.arcgis.com/javascript/latest/assets/references/core/symbols/symbols-3d-mesh.png)
 *
 * See [Symbol3DLayer](https://developers.arcgis.com/javascript/latest/references/core/symbols/Symbol3DLayer/) and [Symbol3D](https://developers.arcgis.com/javascript/latest/references/core/symbols/Symbol3D/) to read
 * more general information about 3D symbols, symbol layers and how they relate to one another.
 *
 * @since 4.0
 * @see [Symbol Builder](https://developers.arcgis.com/javascript/latest/symbol-builder/)
 * @see [Sample - SceneLayer](https://developers.arcgis.com/javascript/latest/sample-code/layers-scenelayer/)
 * @see [SimpleRenderer](https://developers.arcgis.com/javascript/latest/references/core/renderers/SimpleRenderer/)
 * @see [UniqueValueRenderer](https://developers.arcgis.com/javascript/latest/references/core/renderers/UniqueValueRenderer/)
 * @see [Graphic](https://developers.arcgis.com/javascript/latest/references/core/Graphic/)
 * @example
 * let symbol = {
 *   type: "mesh-3d",  // autocasts as new MeshSymbol3D()
 *   symbolLayers: [{
 *     type: "fill",  // autocasts as new FillSymbol3DLayer()
 *     material: { color: "green" }
 *   }]
 * };
 * sceneLayer.renderer = {
 *   type: "simple",  // autocasts as new SimpleRenderer()
 *   symbol: symbol
 * };
 */
export default class MeshSymbol3D extends Symbol3D {
  constructor(properties?: MeshSymbol3DProperties);
  /**
   * A Collection of [Symbol3DLayer](https://developers.arcgis.com/javascript/latest/references/core/symbols/Symbol3DLayer/) objects
   * used to visualize the graphic or feature. Individual symbol layers
   * may be autocast as objects and specified using the `type` property.
   */
  get symbolLayers(): Collection<FillSymbol3DLayer>;
  set symbolLayers(value: ReadonlyArrayOrCollection<FillSymbol3DLayerProperties & { type: "fill"; }>);
  /** The symbol type. */
  get type(): "mesh-3d";
  /**
   * Creates a deep clone of the symbol.
   *
   * @returns A deep clone of the object that
   *                                             invoked this method.
   * @example
   * // Creates a deep clone of the graphic's symbol
   * let symLyr = graphic.symbol.clone();
   */
  clone(): MeshSymbol3D;
}