    import VisualVariableType from '../../../base/enum/VisualVariableType'
    import { defaultValue } from '../../../util'
    import { Zondy } from '../../../base'
    import { createVisualVariable } from './index'

    /**
     * 视觉变量基类
     * @class VisualVariable
     * @moduleEX RendererModule
     * @param {Object} options 初始化参数
     * @param {String} [options.field] 视觉变量字段
     * @param {String} [options.valueExpression] 字段表达式
     * @param {String} [options.valueExpressionTitle] 字段表达式标题
     * @example <caption>支持的视觉变量</caption>
     * [1、color视觉变量]{@link ColorVariable}
     * [2、opactiy视觉变量]{@link OpacityVariable}
     * [3、size视觉变量]{@link SizeVariable}
     * @example <caption>多个视觉变量叠加</caption>
     * // 从图层上获取renderer
     * const renderer = layer.renderer
     * // 设置多个视觉变量。
     * // 需要注意相同视觉变量作用效果一致，按照加入顺序会覆盖前面的效果。
     * // 颜色视觉变量和透明度视觉变量同时作用时，需要将颜色视觉变量放于透明度视觉变量之前。
     * renderer.visualVariables = [
     *  {
            type: "color",
            valueExpression: "$feature.FID",
            stops: [
              {
                color: "#FFFCD4",
                value: 0,
              },
              {
                color: "#350242",
                value: 200,
              },
            ],
         },
         {
            type: "size",
            valueExpression: "$feature.FID",
            stops:[
              {
                size:5,
                value:0
              },
              {
                size:20,
                value:300
              }
            ]
         },
          {
            type: "opacity",
            valueExpression: "$feature.FID",
            stops: [
              {
                opacity: 0.2,
                value: 0,
              },
              {
                opacity: 1.0,
                value:300,
              }
            ],
          }
     * ]
     */
    class VisualVariable {
      constructor(options) {
        options = defaultValue(options, {})
        /**
         * 视觉变量默认类型
         * @member {String} VisualVariable.prototype.type
         */
        this.type = VisualVariableType.default
        /**
         * 视觉变量字段
         * @member {String} VisualVariable.prototype.field
         */
        this.field = defaultValue(options.field, '')
        /**
         * 视觉变量字段表达式
         * @member {String} VisualVariable.prototype.valueExpression
         */
        this.valueExpression = defaultValue(options.valueExpression, '')
        /**
         * 字段表达式标题
         * @member {String} VisualVariable.prototype.valueExpressionTitle
         */
        this.valueExpressionTitle = defaultValue(options.valueExpressionTitle, '')
      }

      /**
       * 通过json构造VisualVariable对象
       * @return {VisualVariable} json对象
       * */
      static fromJSON(json) {
        json = defaultValue(json, {})
        return createVisualVariable(json)
      }

      /**
       * 导出为json对象
       * @return {Object} json对象
       * */
      toJSON() {
        const json = {}
        json.field = this.field
        json.valueExpression = this.valueExpression
        json.valueExpressionTitle = this.valueExpressionTitle
        return json
      }

      /**
       * 克隆对象
       * @return {VisualVariable} 克隆后的VisualVariable对象
       */
      clone() {
        return new VisualVariable(this.toJSON())
      }
    }

    Zondy.Renderer.VisualVariable.VisualVariable = VisualVariable
    export default VisualVariable