    import { Zondy } from '../../base'
    import { defaultValue } from '../../util'
    import { MapGISTextSymbol } from '../../base/symbol'

    /**
     * 注记样式，参考示例：<a href='#new-LabelClass'>[创建注记样式对象]</a>
     * @classdesc 注记样式(目前仅支持三维SceneView上要素图层、GeoJSON、wfs等图层动态注记)
     * @class LabelClass
     * @param {Object} options 构造参数
     * @param {MapGISTextSymbol|TextSymbol} [options.symbol] 文本符号样式
     * @param {String} [options.renderMode] 注记渲染方式,1.canvas 2.label 3.ground(测试)
     * @param {Number} [options.groundScale = 20] 渲染模式为ground时，设置像素与实际单位米之间的比例关系。测试接口。假设groundScale为10，20*20px的逻辑范围贴地时会被渲染为200*200m的注记。
     * @param {String} [options.deconflictionStrategy] 注记避让策略，可选1.'static'默认避让策略 2.'none' 无避让策略
     * @param {Number} [options.maxScale] 最大可见范围,单位为米,不支持渲染类型renderMode为ground的模式。
     * @param {Number} [options.minScale] 最小可见范围,单位为米,不支持渲染类型renderMode为ground的模式。
     * @param {Number} [options.labelHeight = 0] 注记高度,单位为米。不支持渲染类型renderMode为ground的模式，此接口属于待废弃接口，后续可能会改动。
     * @param {String} [options.labelPlacement] 布局位置，描述注记和几何之间的关系,此设置会覆盖符号symbol内关于文字布局样式的定义。针对于点类型可选项1.above-left 2.above-center 3.above-right 4.center-left 5.center-center 6.center-right 7.below-left 8.below-center 9.below-right 针对于线类型 1.'on-line' 压线 2.'above-line' 线上 3.'under-line' 线下 针对于区类型1.'parallel' 平行 2.'outside' 区外 3.'bottom' 底部 4.'skeleton' 骨架线
     * @param {String} [options.currentAttributeName] 当前属性字段,属于临时接口,后续可能会扩充字段表达式，拟废弃，推荐使用labelExpression接口
     * @param {String} [options.labelExpression] label字段表达式
     * @param {Boolean} [options.repeatLabel=true] 是否重复注记，限制线几何类型使用
     * @param {Number} [options.repeatLabelDistance =6000] 重复步长，限制线几何类型使用，单位为米
     * @param {Number} [options.repeatStartRate = 0.3] 开始步长比例，限制线几何、区几何类型使用，范围为0~1。0表示步长分段的开始，1表示步长分段的结尾。
     * @param {Number} [options.repeatEndRate = 0.7] 结束步长比例，限制线几何、区几何类型使用，范围为0~1。0表示步长分段的开始，1表示步长分段的结尾。
     * @param {Number} [options.lineLabelSpread = 'auto-spread'] 线注记分布方式  1.'auto-spread' 字母集中，汉字分散 2.'centralization-spread'集中 3.'decentralize-spread' 分散。限制线几何使用。
     * @param {Number} [options.labelPositionAlong = 'middle'] 线文字与线关系，仅集中注记时生效。1.'start' 线头 2.'middle' 线中点 3.'end' 线尾，限制线使用。

     * @param {Number} [options.skeletonLineStartRate=0.4] 骨架线开始步长比例，限制区几何类型使用，范围为0~1。0表示步长分段的开始，1表示步长分段的结尾。
     * @param {Number} [options.skeletonLineEndRate =0.6] 骨架线结束步长比例，限制区几何类型使用，范围为0~1。0表示步长分段的开始，1表示步长分段的结尾。
     *
     * @summary <h5>支持如下方法：</h5>
     * <a href='#toJSON'>[1、转换为json对象]</a><br/>
     * <a href='#clone'>[2、克隆并返回一个新的LabelClass对象]</a><br/>
     * <a href='#fromJSON'>[3、将JSON里的数据导入，并返回一个新的LabelClass对象]</a><br/>
     *
     * @example <caption><h7 id='new-LabelClass'>初始化注记样式</h7></caption>
     * const labelClass = new Zondy.LabelClass({
     *   // 指定文本符号样式
     *   symbol: new Zondy.Symbol.TextSymbol({
     *     // 文字颜色
     *     color: new Color(252, 100, 22, 1),
     *     // 文字样式
     *     font: new Zondy.Font({
     *       // 字体
     *       family: "微软雅黑",
     *       // 文字大小，单位像素
     *       size: 30,
     *       // 文字是否为斜体，正常模式
     *       style: "normal",
     *       // 文字粗细
     *       weight: "normal"
     *     })
     *   })
     * })
     */
    class LabelClass {
      constructor(options) {
        options = defaultValue(options, {})
        /**
         * 注记符号样式
         * @member {MapGISTextSymbol|TextSymbol} LabelClass.prototype.symbol
         */
        this.symbol = new MapGISTextSymbol(options.symbol)
        /**
         * 注记渲染方式,1.canvas 2.label 3.ground(测试)
         * @member {String} LabelClass.prototype.renderMode
         */
        this.renderMode = defaultValue(options.renderMode, 'canvas')
        /**
         * 避让策略，可选1.'static'默认避让策略 2.'none' 无避让策略
         * @member {String} LabelClass.prototype.deconflictionStrategy
         */
        this.deconflictionStrategy = defaultValue(
          options.deconflictionStrategy,
          'static'
        )
        /**
         * 最大可见范围,单位为米
         * @member {Number} LabelClass.prototype.maxScale
         */
        this.maxScale = options.maxScale
        /**
         * 最小可见范围,单位为米
         * @member {Number} LabelClass.prototype.minScale
         */
        this.minScale = options.minScale
        /**
         * 注记高度,单位为米
         * @member {Number} LabelClass.prototype.labelHeight
         */
        this.labelHeight = defaultValue(options.labelHeight, 0)
        /**
         * 布局位置，描述注记和几何之间的关系。针对于点类型可选项1.above-left 2.above-center 3.above-right 4.center-left 5.center-center 6.center-right 7.below-left 8.below-center 9.below-right 针对于线类型 1.'on-line' 压线 2.'above-line' 线上 3.'under-line' 线下 针对于区类型1.'parallel' 平行 2.'outside' 区外 3.'bottom' 底部 4.'skeleton' 骨架线
         * @member {String} LabelClass.prototype.labelPlacement
         */
        this.labelPlacement = options.labelPlacement
        /**
         * 当前属性字段,属于临时接口,后续可能会扩充字段表达式,后续拟废弃接口
         * @member {String} LabelClass.prototype.currentAttributeName
         */
        this.currentAttributeName = options.currentAttributeName
        /**
         * label字段表达式
         * @member {String} LabelClass.prototype.labelExpression
         */
        this.labelExpression = options.labelExpression
        /**
         * 是否重复注记，限制线几何类型使用
         * @member {Boolean} LabelClass.prototype.repeatLabel
         */
        this.repeatLabel = defaultValue(options.repeatLabel, true)
        /**
         * 重复步长，限制线几何类型使用，单位为米
         * @member {Number} LabelClass.prototype.repeatLabelDistance
         */
        this.repeatLabelDistance = defaultValue(options.repeatLabelDistance, 6000)
        /**
         * 开始步长比例，限制线几何、区几何类型使用，范围为0~1。0表示步长分段的开始，1表示步长分段的结尾。
         * @member {Number} LabelClass.prototype.repeatStartRate
         */
        this.repeatStartRate = defaultValue(options.repeatStartRate, 0.3)
        /**
         * 结束步长比例，限制线几何、区几何类型使用，范围为0~1。0表示步长分段的开始，1表示步长分段的结尾。
         * @member {Number} LabelClass.prototype.repeatEndRate
         */
        this.repeatEndRate = defaultValue(options.repeatEndRate, 0.7)
        /**
         * 线注记分布方式  1.'auto-spread' 字母集中，汉字分散 2.'centralization-spread'集中 3.'decentralize-spread' 分散。限制线几何使用。
         * @member {String} LabelClass.prototype.lineLabelSpread
         */
        this.lineLabelSpread = defaultValue(options.lineLabelSpread, 'auto-spread')
        /**
         * 线文字与线关系，仅集中注记时生效。1.'start' 线头 2.'middle' 线中点 3.'end' 线尾，限制线使用。
         * @member {String} LabelClass.prototype.labelPositionAlong
         */
        this.labelPositionAlong = defaultValue(options.labelPositionAlong, 'middle')
        /**
         * 骨架线开始步长比例，限制区几何类型使用，范围为0~1。0表示步长分段的开始，1表示步长分段的结尾。
         * @member {String} LabelClass.prototype.skeletonLineStartRate
         */
        this.skeletonLineStartRate = defaultValue(
          options.skeletonLineStartRate,
          0.4
        )
        /**
         * 骨架线结束步长比例，限制区几何类型使用，范围为0~1。0表示步长分段的开始，1表示步长分段的结尾。
         * @member {String} LabelClass.prototype.skeletonLineEndRate
         */
        this.skeletonLineEndRate = defaultValue(options.skeletonLineEndRate, 0.6)
        /**
         * 渲染模式为ground时，设置像素与实际单位米之间的比例关系。测试接口。假设groundScale为10，20*20px的逻辑范围贴地时会被渲染为200*200m的注记。
         * @member {Number} LabelClass.prototype.groundScale
         */
        this.groundScale = defaultValue(options.groundScale, 20)
      }

      /**
       * 转换为json对象<a id='toJSON'></a>
       * @return {Object} json对象
       */
      toJSON() {
        return {
          symbol: this.symbol.toJSON(),
          renderMode: this.renderMode,
          deconflictionStrategy: this.deconflictionStrategy,
          maxScale: this.maxScale,
          minScale: this.minScale,
          labelHeight: this.labelHeight,
          labelPlacement: this.labelPlacement,
          currentAttributeName: this.currentAttributeName,
          labelExpression: this.labelExpression,
          repeatLabel: this.repeatLabel,
          repeatLabelDistance: this.repeatLabelDistance,
          repeatStartRate: this.repeatStartRate,
          repeatEndRate: this.repeatEndRate,
          lineLabelSpread: this.lineLabelSpread,
          labelPositionAlong: this.labelPositionAlong,
          skeletonLineStartRate: this.skeletonLineStartRate,
          skeletonLineEndRate: this.skeletonLineEndRate,
          groundScale: this.groundScale
        }
      }

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

      /**
       * 将JSON里的数据导入，并返回一个新的LabelClass对象<a id='fromJSON'></a>
       * @param {Object} [json] 新的LabelClass对象
       * @return {LabelClass} 新的LabelClass对象
       */
      static fromJSON(json) {
        json = defaultValue(json, {})
        return new LabelClass(json)
      }
    }

    Zondy.LabelClass = LabelClass
    export default LabelClass