    import Symbol from './Symbol'
    import Zondy from '../Zondy'
    import { defaultValue, defined, toJSON } from '../../util'
    import { SymbolType } from '../enum'
    import Color from '../Color'
    import HorizontalAlignment from '../enum/HorizontalAlignment'
    import VerticalAlignment from '../enum/VerticalAlignment'
    import Font from '../Font'

    /**
     * 文本符号，支持点几何对象，参考示例：<a href='#new-TextSymbol'>[创建文本样式]</a>
     * <br><br>[ES5引入方式]：<br/>
     * Zondy.Symbol.TextSymbol() <br/>
     * [ES6引入方式]：<br/>
     * import { TextSymbol } from "@mapgis/webclient-common" <br/>
     * <br/>
     * @class TextSymbol
     * @moduleEX SymbolModule
     * @extends Symbol
     * @param {Object} options 构造参数
     * @param1 {Number} [options.angle = 0] 文字的旋转角度，单位度，0~360度，顺时针旋转,需要开启rotated选项
     * @param1 {String} [options.backgroundColor] 背景颜色
     * @param1 {String} [options.borderLineColor] 边界颜色
     * @param1 {Number} [options.borderLineSize] 边界宽度
     * @param1 {String} [options.textShadowColor] 文字阴影颜色
     * @param {String} [options.color = New Zondy.Color(0,0,0)] 颜色
     * @param {Font} [options.font] 字体样式
     * @param1 {String} [options.haloColor] 光晕颜色
     * @param1 {Number} [options.haloSize] 光晕大小
     * @param {HorizontalAlignment} [options.horizontalAlignment = 'center'] 水平方向，可选"left"|"right"|"center"
     * @param1 {Boolean} [options.kerning = true] 是否调整文本字符串中字符之间的间距，二维暂时不支持
     * @param {Number} [options.lineHeight = 1.1] 行高，最小设置为1.1
     * @param1 {Number} [options.lineWidth = 192] 行宽
     * @param1 {Boolean} [options.rotated = false] 是否旋转
     * @param {String} [options.text] 默认显示内容
     * @param {VerticalAlignment} [options.verticalAlignment='baseline'] 垂直对齐,可选"baseline"|"top"|"middle"|"bottom"
     * @param {Number} [options.xoffset = 0] x偏移
     * @param {Number} [options.yoffset = 0] y偏移
     *
     * @summary <h5>支持如下方法：</h5>
     * [1、克隆并返回新的符号对象]{@link Symbol#clone} <br/>
     * [2、导出一个JSON对像]{@link Symbol#toJSON} <br/>
     * <a href='#fromJSON'>[3、将JSON里的数据导入，并返回一个新的TextSymbol对象]</a><br/>
     *
     * @example <caption><h7 id='new-TextSymbol'>创建文本样式</h7></caption>
     * // ES5引入方式
     * const { TextSymbol } = Zondy.Symbol
     * const { TextSymbol, Color } = Zondy
     * // ES6引入方式
     * import { TextSymbol, Color } from "@mapgis/webclient-common"
     * const textSymbol = new TextSymbol({
     *   // 字体颜色
     *   color: new Color(252, 100, 22, 1),
     *   // 字体内容，如果是服务端数据，可不填
     *   text: "默认文字",
     *   // 字体样式
     *   font: {
     *     // 字体
     *     family: "微软雅黑",
     *     // 文字大小，单位像素
     *     size: 30,
     *     // 文字是否为斜体，正常模式
     *     style: "normal",
     *     // 文字粗细
     *     weight: "normal"
     *   }
     * })
     */
    class TextSymbol extends Symbol {
      constructor(options) {
        super(options)
        options = defaultValue(options, {})
        /**
         * 符号类型
         * @member {String} TextSymbol.prototype.type
         */
        this.type = SymbolType.text
        /**
         * 文字角度
         * @member {Number} TextSymbol.prototype.angle
         */
        this.angle = defaultValue(options.angle, 0)
        /**
         * 文字背景颜色
         * @member {Color} TextSymbol.prototype.backgroundColor
         */
        this.backgroundColor = defined(options.backgroundColor)
          ? Color.fromColor(
              defaultValue(options.backgroundColor, new Color(255, 255, 255, 0.25))
            )
          : undefined
        /**
         * 文字外边框颜色
         * @member {Color} TextSymbol.prototype.borderLineColor
         */
        this.borderLineColor = Color.fromColor(
          defaultValue(options.borderLineColor, new Color(0, 0, 0, 1))
        )
        /**
         * 文字外边框线宽
         * @member {Number} TextSymbol.prototype.borderLineSize
         */
        this.borderLineSize = defaultValue(options.borderLineSize, 0)
        /**
         * 文字颜色
         * @member {Color} TextSymbol.prototype.color
         */
        this.color = Color.fromColor(defaultValue(options.color, new Color()))
        /**
         * 文字字体
         * @member {String} TextSymbol.prototype.font
         */
        this.font = Font.fromJSON(defaultValue(options.font, {}))
        /**
         * 光晕颜色
         * @member {Color} TextSymbol.prototype.haloColor
         */
        this.haloColor = Color.fromColor(
          defaultValue(options.haloColor, new Color())
        )
        /**
         * 光晕大小
         * @member {Number} TextSymbol.prototype.haloSize
         */
        this.haloSize = defaultValue(options.haloSize, 0)
        /**
         * 水平方向
         * @member {HorizontalAlignment} TextSymbol.prototype.verticalAlignment
         */
        this.horizontalAlignment = defaultValue(
          options.horizontalAlignment,
          HorizontalAlignment.center
        )
        /**
         * 是否调整文本字符串中字符之间的间距
         * @member {Boolean} TextSymbol.prototype.kerning
         */
        this.kerning = defaultValue(options.kerning, false)
        /**
         * 行高
         * @member {Number} TextSymbol.prototype.lineHeight
         */
        this.lineHeight = defaultValue(options.lineHeight, 1.1)
        /**
         * 行宽
         * @member {Number} TextSymbol.prototype.lineWidth
         */
        this.lineWidth = defaultValue(options.lineWidth, 192)
        /**
         * 是否旋转
         * @member {Boolean} TextSymbol.prototype.rotated
         */
        this.rotated = defaultValue(options.rotated, false)
        /**
         * 显示的内容
         * @member {String} TextSymbol.prototype.text
         */
        this.text = defaultValue(options.text, '')
        /**
         * 垂直对齐
         * @member {VerticalAlignment} TextSymbol.prototype.verticalAlignment
         */
        this.verticalAlignment = defaultValue(
          options.verticalAlignment,
          VerticalAlignment.baseline
        )
        /**
         * x偏移
         * @member {Number} TextSymbol.prototype.xoffset
         */
        this.xoffset = defaultValue(options.xoffset, 0)
        /**
         * y偏移
         * @member {Number} TextSymbol.prototype.yoffset
         */
        this.yoffset = defaultValue(options.yoffset, 0)
      }

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

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

      /**
       * 导出为JSON对象
       * @return {Object} JSON对像
       */
      toJSON() {
        const json = super.toJSON()
        json.angle = this.angle
        json.backgroundColor = toJSON(this.backgroundColor, Color)
        json.borderLineColor = toJSON(this.borderLineColor, Color)
        json.borderLineSize = this.borderLineSize
        json.color = toJSON(this.color, Color)
        json.font = toJSON(this.font, Font)
        json.haloColor = toJSON(this.haloColor, Color)
        json.haloSize = this.haloSize
        json.horizontalAlignment = this.horizontalAlignment
        json.kerning = this.kerning
        json.lineHeight = this.lineHeight
        json.lineWidth = this.lineWidth
        json.rotated = this.rotated
        json.text = this.text
        json.verticalAlignment = this.verticalAlignment
        json.xoffset = this.xoffset
        json.yoffset = this.yoffset
        return json
      }
    }
    Zondy.Symbol.TextSymbol = TextSymbol
    export default TextSymbol