import type Collection from "../../core/Collection.js";
import type VoxelDynamicSection from "./VoxelDynamicSection.js";
import type VoxelSlice from "./VoxelSlice.js";
import type { JSONSupport, JSONSupportMixinProperties } from "../../core/JSONSupport.js";
import type { VoxelSliceProperties } from "./VoxelSlice.js";
import type { ReadonlyArrayOrCollection } from "../../core/Collection.js";
import type { VoxelDynamicSectionProperties } from "./VoxelDynamicSection.js";

export interface VoxelVolumeStyleProperties extends JSONSupportMixinProperties, Partial<Pick<VoxelVolumeStyle, "verticalExaggeration" | "verticalOffset">> {
  /**
   * The collection of [VoxelDynamicSection](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-voxel-VoxelDynamicSection.html).
   *
   * @since 4.25
   */
  dynamicSections?: ReadonlyArrayOrCollection<VoxelDynamicSectionProperties>;
  /**
   * The collection of [VoxelSlice](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-voxel-VoxelSlice.html).
   *
   * @since 4.25
   */
  slices?: ReadonlyArrayOrCollection<VoxelSliceProperties>;
}

/**
 * The VolumeStyle allows you to define rendering properties that apply to the volume itself, such as vertical exaggeration and offset.
 *
 * @since 4.24
 */
export default class VoxelVolumeStyle extends JSONSupport {
  /**
   * @example
   * // Typical usage
   * let volumeStyle = new VoxelVolumeStyle({
   *   verticalExaggeration: 183677
   * });
   */
  constructor(properties?: VoxelVolumeStyleProperties);
  /**
   * The collection of [VoxelDynamicSection](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-voxel-VoxelDynamicSection.html).
   *
   * @since 4.25
   */
  get dynamicSections(): Collection<VoxelDynamicSection>;
  set dynamicSections(value: ReadonlyArrayOrCollection<VoxelDynamicSectionProperties>);
  /**
   * The collection of [VoxelSlice](https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-voxel-VoxelSlice.html).
   *
   * @since 4.25
   */
  get slices(): Collection<VoxelSlice>;
  set slices(value: ReadonlyArrayOrCollection<VoxelSliceProperties>);
  /**
   * The vertical exaggeration factor.
   *
   * @default 1
   */
  accessor verticalExaggeration: number;
  /**
   * The vertical offset amount.
   *
   * @default 0
   */
  accessor verticalOffset: number;
  /**
   * Id of the volume. Should always be 0, as only 1 volume is currently supported.
   *
   * @default 0
   */
  get volumeId(): number;
  /**
   * Creates a deep clone of this object. Any properties that store values by reference will be
   * assigned copies of the referenced values on the cloned instance.
   *
   * @returns A deep clone of the class instance that invoked this method.
   */
  clone(): VoxelVolumeStyle;
}