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

    /**
     * 注记样式，参考示例：<a href='#new-LabelClass'>[创建注记样式对象]</a>
     * @classdesc 注记样式
     * @class LabelClass
     * @param {Object} options 构造参数
     * @param {MapGISTextSymbol} [options.symbol] 文本符号样式
     * @param {String} [options.renderMode] 注记渲染方式,1.canvas 2.label 3.ground(测试)
     * @param {String} [options.deconflictionStrategy] 注记避让策略，可选1.'static'默认避让策略 2.'none' 无避让策略
     * @param {Number} [options.maxScale] 最大可见范围,单位为米
     * @param {Number} [options.minScale] 最小可见范围,单位为米
     * @param {Number} [options.labelHeight = 0] 注记高度,单位为米
     * @param {String} [options.labelPlacement] 布局位置，描述注记和几何之间的关系。针对于点类型可选项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] 当前属性字段,属于临时接口,后续可能会扩充字段表达式
     * @param {Boolean} [options.repeatLabel] 是否重复注记，限制线几何类型使用
     * @param {Number} [options.repeatLabelDistance] 重复步长，限制线几何类型使用，单位为米
     * @param {Number} [options.repeatStartRate] 开始步长比例，限制线几何、区几何类型使用，范围为0~1。0表示步长分段的开始，1表示步长分段的结尾。
     * @param {Number} [options.repeatEndRate] 结束步长比例，限制线几何、区几何类型使用，范围为0~1。0表示步长分段的开始，1表示步长分段的结尾。
     * @param {Number} [options.lineLabelSpread] 线注记分布方式  1.'auto-spread' 字母集中，汉字分散 2.'centralization-spread'集中 3.'decentralize-spread' 分散。限制线几何使用。
     * @param {Number} [options.labelPositionAlong] 线文字与线关系，仅集中注记时生效。1.'start' 线头 2.'middle' 线中点 3.'end' 线尾，限制线使用。
     * @param {Number} [options.skeletonLineStartRate] 骨架线开始步长比例，限制区几何类型使用，范围为0~1。0表示步长分段的开始，1表示步长分段的结尾。
     * @param {Number} [options.skeletonLineEndRate] 骨架线结束步长比例，限制区几何类型使用，范围为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} 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
        /**
         * 是否重复注记，限制线几何类型使用
         * @member {Boolean} LabelClass.prototype.repeatLabel
         */
        this.repeatLabel = options.repeatLabel
        /**
         * 重复步长，限制线几何类型使用，单位为米
         * @member {Number} LabelClass.prototype.repeatLabelDistance
         */
        this.repeatLabelDistance = options.repeatLabelDistance
        /**
         * 开始步长比例，限制线几何、区几何类型使用，范围为0~1。0表示步长分段的开始，1表示步长分段的结尾。
         * @member {Number} LabelClass.prototype.repeatStartRate
         */
        this.repeatStartRate = options.repeatStartRate
        /**
         * 结束步长比例，限制线几何、区几何类型使用，范围为0~1。0表示步长分段的开始，1表示步长分段的结尾。
         * @member {Number} LabelClass.prototype.repeatEndRate
         */
        this.repeatEndRate = options.repeatEndRate
        /**
         * 线注记分布方式  1.'auto-spread' 字母集中，汉字分散 2.'centralization-spread'集中 3.'decentralize-spread' 分散。限制线几何使用。
         * @member {String} LabelClass.prototype.lineLabelSpread
         */
        this.lineLabelSpread = options.lineLabelSpread
        /**
         * 线文字与线关系，仅集中注记时生效。1.'start' 线头 2.'middle' 线中点 3.'end' 线尾，限制线使用。
         * @member {String} LabelClass.prototype.labelPositionAlong
         */
        this.labelPositionAlong = options.labelPositionAlong
        /**
         * 骨架线开始步长比例，限制区几何类型使用，范围为0~1。0表示步长分段的开始，1表示步长分段的结尾。
         * @member {String} LabelClass.prototype.skeletonLineStartRate
         */
        this.skeletonLineStartRate = options.skeletonLineStartRate
        /**
         * 骨架线结束步长比例，限制区几何类型使用，范围为0~1。0表示步长分段的开始，1表示步长分段的结尾。
         * @member {String} LabelClass.prototype.skeletonLineEndRate
         */
        this.skeletonLineEndRate = options.skeletonLineEndRate
      }

      /**
       * 转换为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,
          repeatLabel: this.repeatLabel,
          repeatLabelDistance: this.repeatLabelDistance,
          repeatStartRate: this.repeatStartRate,
          repeatEndRate: this.repeatEndRate,
          lineLabelSpread: this.lineLabelSpread,
          labelPositionAlong: this.labelPositionAlong,
          skeletonLineStartRate: this.skeletonLineStartRate,
          skeletonLineEndRate: this.skeletonLineEndRate
        }
      }

      /**
       * 克隆并返回一个新的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