import type CIMSymbol from "./CIMSymbol.js";
import type ExtrudeSymbol3DLayer from "./ExtrudeSymbol3DLayer.js";
import type FillSymbol3DLayer from "./FillSymbol3DLayer.js";
import type IconSymbol3DLayer from "./IconSymbol3DLayer.js";
import type LabelSymbol3D from "./LabelSymbol3D.js";
import type LineSymbol3D from "./LineSymbol3D.js";
import type LineSymbol3DLayer from "./LineSymbol3DLayer.js";
import type MeshSymbol3D from "./MeshSymbol3D.js";
import type ObjectSymbol3DLayer from "./ObjectSymbol3DLayer.js";
import type PathSymbol3DLayer from "./PathSymbol3DLayer.js";
import type PictureFillSymbol from "./PictureFillSymbol.js";
import type PictureMarkerSymbol from "./PictureMarkerSymbol.js";
import type PointSymbol3D from "./PointSymbol3D.js";
import type PolygonSymbol3D from "./PolygonSymbol3D.js";
import type SimpleFillSymbol from "./SimpleFillSymbol.js";
import type SimpleLineSymbol from "./SimpleLineSymbol.js";
import type SimpleMarkerSymbol from "./SimpleMarkerSymbol.js";
import type TextSymbol from "./TextSymbol.js";
import type TextSymbol3DLayer from "./TextSymbol3DLayer.js";
import type WaterSymbol3DLayer from "./WaterSymbol3DLayer.js";
import type WebStyleSymbol from "./WebStyleSymbol.js";
import type { CIMSymbolProperties } from "./CIMSymbol.js";
import type { LabelSymbol3DProperties } from "./LabelSymbol3D.js";
import type { LineSymbol3DProperties } from "./LineSymbol3D.js";
import type { MeshSymbol3DProperties } from "./MeshSymbol3D.js";
import type { PictureFillSymbolProperties } from "./PictureFillSymbol.js";
import type { PictureMarkerSymbolProperties } from "./PictureMarkerSymbol.js";
import type { PointSymbol3DProperties } from "./PointSymbol3D.js";
import type { PolygonSymbol3DProperties } from "./PolygonSymbol3D.js";
import type { SimpleFillSymbolProperties } from "./SimpleFillSymbol.js";
import type { SimpleLineSymbolProperties } from "./SimpleLineSymbol.js";
import type { SimpleMarkerSymbolProperties } from "./SimpleMarkerSymbol.js";
import type { TextSymbolProperties } from "./TextSymbol.js";
import type { WebStyleSymbolProperties } from "./WebStyleSymbol.js";

/**
 * Line styles for 2D and 3D symbols.
 *
 * @since 5.0
 * @see [SimpleLineSymbol.style](https://developers.arcgis.com/javascript/latest/api-reference/esri-symbols-SimpleLineSymbol.html#style)
 * @see [LineStylePattern3D.style](https://developers.arcgis.com/javascript/latest/api-reference/esri-symbols-patterns-LineStylePattern3D.html#style)
 */
export type LineStyle = "dash" | "dash-dot" | "dot" | "long-dash" | "long-dash-dot" | "long-dash-dot-dot" | "none" | "short-dash" | "short-dash-dot" | "short-dash-dot-dot" | "short-dot" | "solid";

/**
 * Line cap styles for 2D and 3D symbols.
 *
 * @since 5.0
 * @see [SimpleLineSymbol.cap](https://developers.arcgis.com/javascript/latest/api-reference/esri-symbols-SimpleLineSymbol.html#cap)
 * @see [LineSymbol3DLayer.cap](https://developers.arcgis.com/javascript/latest/api-reference/esri-symbols-LineSymbol3DLayer.html#cap)
 */
export type LineCap = "square" | "round" | "butt";

/**
 * Line join styles for 2D and 3D symbols.
 *
 * @since 5.0
 * @see [SimpleLineSymbol.join](https://developers.arcgis.com/javascript/latest/api-reference/esri-symbols-SimpleLineSymbol.html#join)
 * @see [LineSymbol3DLayer.join](https://developers.arcgis.com/javascript/latest/api-reference/esri-symbols-LineSymbol3DLayer.html#join)
 */
export type LineJoin = "miter" | "bevel" | "round";

/**
 * Line marker placement options for 2D and 3D symbols.
 *
 * @since 5.0
 * @see [LineStyleMarker3D.placement](https://developers.arcgis.com/javascript/latest/api-reference/esri-symbols-LineStyleMarker3D.html#placement)
 * @see [LineSymbolMarker.placement](https://developers.arcgis.com/javascript/latest/api-reference/esri-symbols-LineSymbolMarker.html#placement)
 */
export type LineMarkerPlacement = "begin" | "end" | "begin-end";

/**
 * Line marker styles for 2D and 3D symbols.
 *
 * @since 5.0
 * @see [LineStyleMarker3D.style](https://developers.arcgis.com/javascript/latest/api-reference/esri-symbols-LineStyleMarker3D.html#style)
 * @see [LineSymbolMarker.style](https://developers.arcgis.com/javascript/latest/api-reference/esri-symbols-LineSymbolMarker.html#style)
 */
export type LineMarkerStyle = "arrow" | "circle" | "square" | "diamond" | "cross" | "x";

/**
 * Fill styles for 2D and 3D symbols.
 *
 * @since 5.0
 * @see [StylePattern3D.style](https://developers.arcgis.com/javascript/latest/api-reference/esri-symbols-patterns-StylePattern3D.html#style)
 * @see [SimpleFillSymbol.style](https://developers.arcgis.com/javascript/latest/api-reference/esri-symbols-SimpleFillSymbol.html#style)
 */
export type FillStyle = "backward-diagonal" | "cross" | "diagonal-cross" | "forward-diagonal" | "horizontal" | "none" | "solid" | "vertical";

/**
 * Profile styles for PathSymbol3DLayer.
 *
 * @since 5.0
 * @see [PathSymbol3DLayer.profile](https://developers.arcgis.com/javascript/latest/api-reference/esri-symbols-PathSymbol3DLayer.html#profile)
 */
export type PathSymbol3DLayerProfile = "circle" | "quad";

/**
 * Layer join styles for PathSymbol3DLayer.
 *
 * @since 5.0
 * @see [PathSymbol3DLayer.join](https://developers.arcgis.com/javascript/latest/api-reference/esri-symbols-PathSymbol3DLayer.html#join)
 */
export type PathSymbol3DLayerJoin = LineJoin;

/**
 * Line cap styles for PathSymbol3DLayer.
 *
 * @since 5.0
 * @see [PathSymbol3DLayer.cap](https://developers.arcgis.com/javascript/latest/api-reference/esri-symbols-PathSymbol3DLayer.html#cap)
 */
export type PathSymbol3DLayerCap = LineCap | "none";

/**
 * Anchor positions for PathSymbol3DLayer.
 *
 * @since 5.0
 * @see [PathSymbol3DLayer.anchor](https://developers.arcgis.com/javascript/latest/api-reference/esri-symbols-PathSymbol3DLayer.html#anchor)
 */
export type PathSymbol3DLayerAnchor = "center" | "bottom" | "top";

/**
 * Rotation modes for PathSymbol3DLayer.
 *
 * @since 5.0
 * @see [PathSymbol3DLayer.profileRotation](https://developers.arcgis.com/javascript/latest/api-reference/esri-symbols-PathSymbol3DLayer.html#profileRotation)
 */
export type PathSymbol3DLayerProfileRotation = "heading" | "all";

/**
 * Types of anchors for IconSymbol3DLayer.
 *
 * @since 5.0
 * @see [IconSymbol3DLayer.anchor](https://developers.arcgis.com/javascript/latest/api-reference/esri-symbols-IconSymbol3DLayer.html#anchor)
 */
export type IconSymbol3DLayerAnchor = "center" | "left" | "right" | "top" | "bottom" | "top-left" | "top-right" | "bottom-left" | "bottom-right" | "relative";

/**
 * Primitive shapes for IconSymbol3DLayer.
 *
 * @since 5.0
 * @see [IconSymbol3DLayerResource.primitive](https://developers.arcgis.com/javascript/latest/api-reference/esri-symbols-support-IconSymbol3DLayerResource.html#primitive)
 */
export type IconSymbol3DLayerPrimitive = "x" | "circle" | "square" | "cross" | "triangle" | "kite";

/**
 * Types of anchors for ObjectSymbol3DLayer.
 *
 * @since 5.0
 * @see [ObjectSymbol3DLayer.anchor](https://developers.arcgis.com/javascript/latest/api-reference/esri-symbols-ObjectSymbol3DLayer.html#anchor)
 */
export type ObjectSymbol3DLayerAnchor = "center" | "top" | "bottom" | "origin" | "relative";

/**
 * Primitive types for ObjectSymbol3DLayer.
 *
 * @since 5.0
 * @see [ObjectSymbol3DLayerResource.primitive](https://developers.arcgis.com/javascript/latest/api-reference/esri-symbols-support-ObjectSymbol3DLayerResource.html#primitive)
 */
export type ObjectSymbol3DLayerPrimitiveType = "sphere" | "cylinder" | "cube" | "cone" | "inverted-cone" | "diamond" | "tetrahedron";

/**
 * Sizes of water bodies for WaterSymbol3DLayer.
 *
 * @since 5.0
 * @see [WaterSymbol3DLayer.waterbodySize](https://developers.arcgis.com/javascript/latest/api-reference/esri-symbols-WaterSymbol3DLayer.html#waterbodySize)
 */
export type WaterBodySize = "small" | "medium" | "large";

/**
 * Strength of waves for WaterSymbol3DLayer.
 *
 * @since 5.0
 * @see [WaterSymbol3DLayer.waveStrength](https://developers.arcgis.com/javascript/latest/api-reference/esri-symbols-WaterSymbol3DLayer.html#waveStrength)
 */
export type WaveStrength = "calm" | "rippled" | "slight" | "moderate";

/**
 * Font decoration options.
 *
 * @since 5.0
 * @see [Font.decoration](https://developers.arcgis.com/javascript/latest/api-reference/esri-symbols-Font.html#decoration)
 */
export type FontDecoration = "none" | "underline" | "line-through";

/**
 * Font style options.
 *
 * @since 5.0
 * @see [Font.style](https://developers.arcgis.com/javascript/latest/api-reference/esri-symbols-Font.html#style)
 */
export type FontStyle = "normal" | "italic" | "oblique";

/**
 * Font weight options.
 *
 * @since 5.0
 * @see [Font.weight](https://developers.arcgis.com/javascript/latest/api-reference/esri-symbols-Font.html#weight)
 */
export type FontWeight = "normal" | "lighter" | "bold" | "bolder";

/**
 * Horizontal text alignment options.
 *
 * @since 5.0
 * @see [TextSymbol.horizontalAlignment](https://developers.arcgis.com/javascript/latest/api-reference/esri-symbols-TextSymbol.html#horizontalAlignment)
 * @see [TextSymbol3DLayer.horizontalAlignment](https://developers.arcgis.com/javascript/latest/api-reference/esri-symbols-TextSymbol3DLayer.html#horizontalAlignment)
 */
export type TextHorizontalAlignment = "left" | "right" | "center";

/**
 * Vertical text alignment options.
 *
 * @since 5.0
 * @see [TextSymbol.verticalAlignment](https://developers.arcgis.com/javascript/latest/api-reference/esri-symbols-TextSymbol.html#verticalAlignment)
 * @see [TextSymbol3DLayer.verticalAlignment](https://developers.arcgis.com/javascript/latest/api-reference/esri-symbols-TextSymbol3DLayer.html#verticalAlignment)
 */
export type TextVerticalAlignment = "baseline" | "top" | "middle" | "bottom";

/**
 * Union of all 3D symbol layers.
 *
 * @since 5.0
 */
export type Symbol3DLayerUnion = ExtrudeSymbol3DLayer | FillSymbol3DLayer | IconSymbol3DLayer | LineSymbol3DLayer | ObjectSymbol3DLayer | PathSymbol3DLayer | TextSymbol3DLayer | WaterSymbol3DLayer;

/** @since 5.0 */
export type Symbol3DLayerType = Symbol3DLayerUnion["type"];

/**
 * Union of all 2D fill symbols.
 *
 * @since 5.0
 */
export type FillSymbolUnion = PictureFillSymbol | SimpleFillSymbol;

/**
 * Union of all 2D marker symbols.
 *
 * @since 5.0
 */
export type MarkerSymbolUnion = PictureMarkerSymbol | SimpleMarkerSymbol;

/**
 * Union of all 2D symbols.
 *
 * @since 5.0
 */
export type Symbol2DUnion = PictureFillSymbol | PictureMarkerSymbol | SimpleFillSymbol | SimpleLineSymbol | SimpleMarkerSymbol | TextSymbol | CIMSymbol;

/** @since 5.0 */
export type Symbol2DUnionProperties = (PictureFillSymbolProperties & { type: "picture-fill"; }) | (PictureMarkerSymbolProperties & { type: "picture-marker"; }) | (SimpleFillSymbolProperties & { type: "simple-fill"; }) | (SimpleLineSymbolProperties & { type: "simple-line"; }) | (SimpleMarkerSymbolProperties & { type: "simple-marker"; }) | (TextSymbolProperties & { type: "text"; }) | (CIMSymbolProperties & { type: "cim"; });

/**
 * Union of all 3D symbols.
 *
 * @since 5.0
 */
export type Symbol3DUnion = LabelSymbol3D | LineSymbol3D | MeshSymbol3D | PointSymbol3D | PolygonSymbol3D;

/** @since 5.0 */
export type Symbol3DUnionProperties = (LabelSymbol3DProperties & { type: "label-3d"; }) | (LineSymbol3DProperties & { type: "line-3d"; }) | (MeshSymbol3DProperties & { type: "mesh-3d"; }) | (PointSymbol3DProperties & { type: "point-3d"; }) | (PolygonSymbol3DProperties & { type: "polygon-3d"; });

/**
 * Union of all 2D and 3D symbols.
 *
 * @since 5.0
 */
export type Symbol2D3DUnion = Symbol2DUnion | Symbol3DUnion;

/**
 * Union of all symbols.
 *
 * @since 5.0
 */
export type SymbolUnion = Symbol2DUnion | Symbol3DUnion | WebStyleSymbol;

/** @since 5.0 */
export type SymbolType = SymbolUnion["type"];

/** @since 5.0 */
export type SymbolUnionProperties = Symbol2DUnionProperties | Symbol3DUnionProperties | (WebStyleSymbolProperties & { type: "web-style"; });

/** @since 5.0 */
export type PointSymbolUnion = PictureMarkerSymbol | SimpleMarkerSymbol | PointSymbol3D | CIMSymbol;

/** @since 5.0 */
export type LineSymbolUnion = SimpleLineSymbol | LineSymbol3D | CIMSymbol;

/** @since 5.0 */
export type PolygonSymbolUnion = SimpleFillSymbol | PictureFillSymbol | PolygonSymbol3D | CIMSymbol;