    import Zondy from '../../Zondy'
    import { defaultValue } from '../../../util'
    import { AnchorType, ProfileType, Symbol3DLayerType } from '../../enum'
    import LineCapType from '../../enum/LineCapType'
    import LineJoinType from '../../enum/LineJoinType'
    import Symbol3DLayer from './Symbol3DLayer'
    import { ColorMaterial } from '../support'

    /**
     * 三维管道符号图层，定义如何在三维场景视图中绘制一个管道线<br/>
     * 示例如下：<br/>
     * <a href='#PathSymbol3DLayer'>[1、创建三维管道符号图层]</a><br/>
     *
     * @class PathSymbol3DLayer
     * @moduleEX SymbolModule
     * @extends Symbol3DLayer
     * @param {Object} options 构造参数
     * @param {ColorMaterial} [options.material = new ColorMaterial()] 管道的材质，目前支持的材质有：<br/>
     * ColorMaterial: 纯色材质，通过设置纯色材质来改变管道的颜色
     * @param {ProfileType} [options.profile = ProfileType.circle] 管道横截面类型，圆形或者矩形
     * @param {Number} [options.width = null] 管道的宽度，如果没有设置，那么管道宽度就和管道高度一致，如果高度和宽度都没有设置，则不显示管道
     * @param {Number} [options.height = null] 管道的高度，如果没有设置，那么管道高度就和管道宽度一致，如果高度和宽度都没有设置，则不显示管道
     * @param {LineJoinType} [options.join = LineJoinType.miter] 管道拐角样式
     * @param {LineCapType} [options.cap = LineCapType.butt] 管道首尾端点样式
     * @param {Boolean} [options.castShadows = true] 是否显示阴影
     * @param {AnchorType} [options.anchor = AnchorType.center] 管道几何体相对于点坐标的位置
     *
     * @summary <h5>支持如下方法：</h5>
     * <a href='#fromJSON'>[1、通过json数据构造一个PathSymbol3DLayer对象]</a><br/>
     * <a href='#toJSON'>[2、导出为json数据]</a><br/>
     * <a href='#clone'>[3、克隆并返回一个新的PathSymbol3DLayer对象]</a><br/>
     *
     * @example <caption><h7 id='PathSymbol3DLayer'>创建三维管道符号图层</h7></caption>
     * // ES5引入方式
     * const { AnchorType, LineCapType, ProfileType } = Zondy.Enum
     * const { PathSymbol3DLayer, ColorMaterial } = Zondy.Symbol
     * // ES6引入方式
     * import { AnchorType, LineCapType, ProfileType, PathSymbol3DLayer, ColorMaterial } from "@mapgis/webclient-common"
     *
     * // 创建三维管道符号图层
     * const pathSymbol3DLayer = new PathSymbol3DLayer({
     *   // 设置管道几何体相对于点坐标的位置
     *   anchor: AnchorType.center,
     *   // 管道首尾端点样式
     *   cap: LineCapType.butt,
     *   // 是否显示阴影
     *   castShadows: true,
     *   // 管道的宽度
     *   width: 40,
     *   // 管道的高度
     *   height: 40,
     *   // 管道的材质
     *   material: new ColorMaterial(),
     *   // 管道横截面类型
     *   profile: ProfileType.circle
     * })
     * */
    class PathSymbol3DLayer extends Symbol3DLayer {
      constructor(options) {
        super(options)
        options = defaultValue(options, {})
        /**
         * 三维符号图层类型
         * @member {Symbol3DLayerType} PathSymbol3DLayer.prototype.type
         */
        this.type = Symbol3DLayerType.path
        /**
         * 管道几何体相对于点坐标的位置
         * @member {AnchorType} PathSymbol3DLayer.prototype.anchor
         */
        this.anchor = defaultValue(options.anchor, AnchorType.center)
        /**
         * 管道首尾端点样式
         * @member {LineCapType} PathSymbol3DLayer.prototype.cap
         */
        this.cap = defaultValue(options.cap, LineCapType.butt)
        /**
         * 是否显示阴影
         * @member {Boolean} PathSymbol3DLayer.prototype.castShadows
         */
        this.castShadows = defaultValue(options.castShadows, true)
        /**
         * 管道的高度，如果没有设置，那么管道高度就和管道宽度一致，如果高度和宽度都没有设置，则不显示管道
         * @member {Number} PathSymbol3DLayer.prototype.height
         */
        this.height = defaultValue(options.height, undefined)
        /**
         * 管道的宽度，如果没有设置，那么管道宽度就和管道高度一致，如果高度和宽度都没有设置，则不显示管道
         * @member {Boolean} PathSymbol3DLayer.prototype.height
         */
        this.width = defaultValue(options.width, undefined)
        /**
         * 管道拐角样式
         * @member {LineJoinType} PathSymbol3DLayer.prototype.join
         */
        this.join = defaultValue(options.join, LineJoinType.miter)
        /**
         * 材质
         * @member {ColorMaterial} PathSymbol3DLayer.prototype.material
         */
        this.material = options.material
          ? ColorMaterial.fromJSON(options.material)
          : new ColorMaterial()
        /**
         * 管道横截面类型
         * @member {ProfileType} PathSymbol3DLayer.prototype.profile
         */
        this.profile = defaultValue(options.profile, ProfileType.circle)
      }

      /**
       * <a id='fromJSON'/>
       * 通过json数据构造一个PathSymbol3DLayer对象
       * @param {Object} json json数据
       * @return {LineCallout3D} 新的PathSymbol3DLayer对象
       * */
      static fromJSON(json) {
        return new PathSymbol3DLayer(json)
      }

      /**
       * <a id='toJSON'/>
       * 导出为json数据
       * @return {Object} 导出的json数据
       * */
      toJSON() {
        return {
          type: this.type,
          anchor: this.anchor,
          cap: this.cap,
          castShadows: this.castShadows,
          height: this.height,
          width: this.width,
          join: this.join,
          material: this.material,
          profile: this.profile
        }
      }

      /**
       * <a id='clone'/>
       * 克隆并返回一个新的PathSymbol3DLayer对象
       * @return {PathSymbol3DLayer} 新的PathSymbol3DLayer对象
       * */
      clone() {
        return new PathSymbol3DLayer(this.toJSON())
      }
    }

    Zondy.Symbol.PathSymbol3DLayer = PathSymbol3DLayer
    export default PathSymbol3DLayer