    import Evented from '../Evented'
    import Zondy from '../Zondy'
    import { Color } from '../index'
    import { defaultValue } from '../../util'
    import { SymbolType } from '../enum'
    import { createSymbol } from './index'

    /**
     * 符号基类
     * @class Symbol
     * @moduleEX SymbolModule
     * @param {Object} options 构造参数
     * @param {Color|String|Array|Object} [options.color = new Color(255, 255, 255, 0.25)] 颜色
     * @see [<h4>目前支持的几种符号类型</h4>]{@tutorial 符号}
     * @example 设置颜色的几种方式
     * 1.结构化形式
     * symbol.color = new Color(255, 255, 255, 0.25)
     * symbol.color ={
     *    red:255,
     *    green:0,
     *    blue:0,
     *    alpha:1
     * }
     * 2.数组
     * symbol.color = [255,0,0]
     * symbol.color = [255,0,0,1]
     * 3.字符串
     * symbol.color = '#ff0000'
     * symbol.color = 'rgba(255,0,0,1)'
     */
    class Symbol extends Evented {
      constructor(options) {
        super()
        options = defaultValue(options, {})
        /**
         * 颜色
         * @member {Color} Symbol.prototype.color
         */
        this.color = Color.fromColor(
          defaultValue(options.color, new Color(255, 255, 255, 0.25))
        )
        /**
         * 符号类型
         * @member {String} Symbol.prototype.type
         */
        this.type = SymbolType.default
      }

      /**
       * @function Symbol.fromJSON
       * @description 通过json文件构建symbol
       * @param {Object} json 符号的实例化JSON
       * @example
       * // ES5引入方式
       * const { Symbol, Color } = Zondy
       * // ES6引入方式
       * import { Symbol, Color } from "@mapgis/webclient-common"
       * const simpleLineSymbol = Symbol.fromJSON({
       *     type:'simple-line',
       *     color:new Color(255,255,255,1),
       *     width:2
       * })
       */
      static fromJSON(json) {
        return createSymbol(json)
      }

      /**
       * 导出为JSON对象
       * @return {Object} JSON对像
       */
      toJSON() {
        return {
          color: Color.fromColor(this.color).toJSON(),
          type: this.type
        }
      }

      /**
       * 克隆并返回新的符号对象
       * @return {Symbol} 克隆后的新符号对象
       */
      clone() {
        return new Symbol(this.toJSON())
      }
    }

    Zondy.Symbol.Symbol = Symbol
    export default Symbol