    import BaseRenderer from './BaseRenderer'
    import { defaultValue } from '../../util'
    import { Zondy } from '../../base'
    import { RendererType } from '../../base/enum'
    import { Symbol } from '../../base/symbol'
    /**
     * 等级符号专题图，符号尺寸随指定字段的值的变化而变化
     * @class RankRenderer
     * @extends BaseRenderer
     * @moduleEX RendererModule
     * @param {Object} options 构造参数
     * @param {String} [options.field] 要素字段名
     * @param {Number} [options.minSize = 12] 等级符号最小尺寸，单位像素
     * @param {Number} [options.maxSize = 50] 等级符号最大尺寸，单位像素
     * @param {Number} [options.minDataValue] 最小数据范围，如果小于此数据范围按minSize进行符号渲染
     * @param {Number} [options.maxDataValue] 最大数据范围，如果超出此数据范围按maxSize进行符号渲染
     * @param {Symbol} [options.symbol] 等级符号样式，目前仅支持SimpleMarkerSymbol|PictureMarkerSymbol|TextSymbol，不支持线图层
     * @param {String} [options.valueExpression] 数据字段表达式，设置了会覆盖field的值
     * @param {String} [options.valueExpressionTitle] 数据字段表达式标题
     *
     * @summary <h5>支持如下方法：</h5>
     * <a href='#fromJSON'>[1、通过json构造RankRenderer对象]</a><br/>
     * <a href='#toJSON'>[2、导出json对象]</a><br/>
     * <a href='#clone'>[3、克隆RankRenderer对象]</a>
     *
     * @example <caption><h7 id='new-PictureMarkerSymbol'>创建随机渲染器对象</h7></caption>
     * // ES5引入方式
     * const { RankRenderer } = Zondy.Renderer
     * const { SimpleMarkerSymbol, SimpleLineSymbol } = Zondy.Symbol
     * // ES6引入方式
     * import { RankRenderer, SimpleMarkerSymbol, SimpleLineSymbol } from "@mapgis/webclient-common"
     * // 初始化等级符号渲染器对象
     * const rankRenderer = new RankRenderer({
     *   // 等级符号最小尺寸，单位像素
     *   minSize: 12,
     *   // 等级符号最大尺寸，单位像素
     *   maxSize: 50,
     *   // 字段名
     *   field: '字段名',
     *   // 符号样式
     *   symbol:new SimpleMarkerSymbol({
     *     // 填充颜色
     *     color:'#00ff00',
     *     // 符号形状样式
     *     style:'diamond',
     *     // 符号外边线样式
     *     outline:new SimpleLineSymbol({
     *       // 符号外边线颜色
     *       color: '#ff0000',
     *       // 符号外边线宽度
     *       width: 2
     *     })
     *   })
     * })
     */
    class RankRenderer extends BaseRenderer {
      constructor(options) {
        super(options)
        options = defaultValue(options, {})
        /**
         * 符号类型，默认为‘rank’
         * @readonly
         * @member {String} RankRenderer.prototype.type
         */
        this.type = RendererType.rank
        /**
         * 等级符号最大尺寸，单位像素
         * @member {Number} RankRenderer.prototype.maxSize
         */
        this.maxSize = defaultValue(options.maxSize, 50)
        /**
         * 等级符号最小尺寸，单位像素
         * @member {Number} RankRenderer.prototype.minSize
         */
        this.minSize = defaultValue(options.minSize, 12)
        /**
         * 最大数据范围，如果超出此数据范围按maxSize进行符号渲染
         * @member {Number} RankRenderer.prototype.maxDataValue
         */
        this.maxDataValue = options.maxDataValue
        /**
         * 最小数据范围，如果小于此数据范围按minSize进行符号渲染
         * @member {Number} RankRenderer.prototype.minDataValue
         */
        this.minDataValue = options.minDataValue
        /**
         * 等级符号样式，目前仅支持SimpleMarkerSymbol|PictureMarkerSymbol|TextSymbol
         * @member {Symbol} RankRenderer.prototype.symbol
         */
        this.symbol = this._decorate(
          'symbol',
          options.symbol,
          Symbol,
          Symbol.fromJSON
        )
        /**
         * 要素字段名
         * @member {String} RankRenderer.prototype.field
         */
        this.field = options.field
        /**
         * 数据字段表达式

         * @member {String} RankRenderer.prototype.valueExpression
         */
        this.valueExpression = options.valueExpression
        /**
         * 数据字段表达式标题
         * @member {String} RankRenderer.prototype.valueExpressionTitle
         */
        this.valueExpressionTitle = options.valueExpressionTitle
      }

      /**
       * <a id='fromJSON'/>
       * 通过json构造RankRenderer对象
       * @param {Object} json json对象
       * @return {RankRenderer} RankRenderer实例
       */
      static fromJSON(json) {
        json = defaultValue(json, {})
        return new RankRenderer(json)
      }

      /**
       * <a id='toJSON'/>
       * 导出json对象
       * @return {Object} json对象
       */
      toJSON() {
        const json = super.toJSON()
        json.type = this.type
        json.maxSize = this.maxSize
        json.minSize = this.minSize
        json.maxDataValue = this.maxDataValue
        json.minDataValue = this.minDataValue
        json.symbol = this.symbol.toJSON()
        json.field = this.field
        json.valueExpression = this.valueExpression
        json.valueExpressionTitle = this.valueExpressionTitle
        return json
      }

      /**
       * <a id='clone'/>
       * 克隆RankRenderer对象
       * @return {RankRenderer} 克隆后的RankRenderer实例
       */
      clone() {
        return new RankRenderer(this.toJSON())
      }
    }

    Zondy.Renderer.RankRenderer = RankRenderer
    export default RankRenderer