import { mapgis } from '../common/base';

import { HorizontalAlignment, VerticalAlignment } from './Enum';
import Symbol from './Symbol';
import Font from './Font';

/**
 * 文本符号
 * @author 基础平台-潘卓然
 * @class mapgis.symbols.PointStyle
 * @classdesc 文本符号
 * @param {String} [type = 'text'] marker类型:只能是"text"
 * @param {Number} [angle = 0] 角度
 * @param {String} [backgroundColor] 背景颜色
 * @param {Number} [backgroundPadding=0] 背景内边距
 * @param {String} [borderLineColor] 边界颜色
 * @param {Number} [borderLineSize] 边界宽度
 * @param {String} [textDecorationUnderlineColor] 文字下划线颜色
 * @param {Number} [textDecorationUnderlineWidth] 文字下划线宽度
 * @param {String} [textDecorationThroughlineColor] 文字删除线颜色
 * @param {Number} [textDecorationThroughlineWidth] 文字删除线宽度
 * @param {Number} [textShadowOffsetX] 文字阴影横轴偏移
 * @param {Number} [textShadowOffsetY] 文字阴影纵轴偏移
 * @param {String} [textShadowColor] 文字阴影颜色
 * @param {Number} [textShadowBlur] 文字阴影模糊度
 * @param {String} [color='rgb(0,0,0)'] 颜色
 * @param {Font} [font] 字体
 * @param {String} [haloColor] 光晕颜色
 * @param {Number} [haloSize] 光晕大小
 * @param {HorizontalAlignment} [horizontalAlignment='center'] 水平方向，可选"left"|"right"|"center"
 * @param {Boolean} [kerning=true] 空格间距
 * @param {Number} [letterSpacing=0] 文字间距
 * @param {Number} [lineHeight=1.0] 行高
 * @param {Number} [lineWidth=192] 行宽
 * @param {Number} [lineMaxNum=3] 文字最大行数
 * @param {Boolean} [textWraps=false] 是否换行
 * @param {Boolean} [rotated=false] 是否旋转
 * @param {String} [text] 显示内容
 * @param {VerticalAlignment} [verticalAlignment='baseline'] 垂直对齐,可选"baseline"|"top"|"middle"|"bottom"
 * @param {Number} [xoffset=0] x偏移
 * @param {Number} [yoffset=0] y偏移
 */
export default class TextSymbol extends Symbol {
    constructor(option) {
        super(option);
        var options = option ? option : {};
        const { angle = 0, backgroundColor, backgroundPadding = 0, borderLineColor, borderLineSize } = options;
        const { textDecorationUnderlineColor, textDecorationUnderlineWidth, textDecorationThroughlineColor, textDecorationThroughlineWidth } =
            options;
        const { textShadowOffsetX, textShadowOffsetY, textShadowColor, textShadowBlur } = options;
        const { color = 'rgb(0,0,0)', font, haloColor, haloSize } = options;
        const { horizontalAlignment = HorizontalAlignment.center, verticalAlignment = VerticalAlignment.baseline } = options;
        const { kerning = true, lineHeight = 1.0, lineWidth = 192, letterSpacing = 0, lineMaxNum = 3, textWraps = false, rotated = false } = options;
        const { text, xoffset = 0, yoffset = 0 } = options;

        this.type = 'text';
        this.angle = angle;
        this.backgroundColor = backgroundColor;
        this.backgroundPadding = backgroundPadding;
        this.borderLineColor = borderLineColor;
        this.borderLineSize = borderLineSize;
        this.textDecorationUnderlineColor = textDecorationUnderlineColor;
        this.textDecorationUnderlineWidth = textDecorationUnderlineWidth;
        this.textDecorationThroughlineColor = textDecorationThroughlineColor;
        this.textDecorationThroughlineWidth = textDecorationThroughlineWidth;
        this.textShadowOffsetX = textShadowOffsetX;
        this.textShadowOffsetY = textShadowOffsetY;
        this.textShadowColor = textShadowColor;
        this.textShadowBlur = textShadowBlur;
        this.color = color;
        this.font = font ? new Font(font) : undefined;
        this.haloColor = haloColor;
        this.haloSize = haloSize;
        this.horizontalAlignment = horizontalAlignment;
        this.kerning = kerning;
        this.lineHeight = lineHeight;
        this.lineWidth = lineWidth;
        this.letterSpacing = letterSpacing;
        this.lineMaxNum = lineMaxNum;
        this.textWraps = textWraps;
        this.rotated = rotated;
        this.text = text;
        this.verticalAlignment = verticalAlignment;
        this.xoffset = xoffset;
        this.yoffset = yoffset;
    }

    /**
     * @description 将JSON格式的符号转换为JS对象
     * @param {Object} json 符号的实例化JSON
     */
    fromJSON(json) {
        json = json || {};
        const { opacity = 1.0 } = json;
        const { type = 'text' } = json;
        const { angle = 0, backgroundColor, backgroundPadding = 0, borderLineColor, borderLineSize } = options;
        const { textDecorationUnderlineColor, textDecorationUnderlineWidth, textDecorationThroughlineColor, textDecorationThroughlineWidth } =
            options;
        const { textShadowOffsetX, textShadowOffsetY, textShadowColor, textShadowBlur } = options;
        const { color = 'rgb(0,0,0)', font, haloColor, haloSize } = options;
        const { horizontalAlignment = HorizontalAlignment.center, verticalAlignment = VerticalAlignment.baseline } = options;
        const { kerning = true, lineHeight = 1.0, lineWidth = 192, letterSpacing = 0, lineMaxNum = 3, textWraps = false, rotated = false } = options;
        const { text, xoffset = 0, yoffset = 0 } = options;

        // 父类属性Symbol.fromJSON
        this.opacity = opacity;

        // 自身属性
        this.type = type;
        this.angle = angle;
        this.backgroundColor = backgroundColor;
        this.backgroundPadding = backgroundPadding;
        this.borderLineColor = borderLineColor;
        this.borderLineSize = borderLineSize;
        this.textDecorationUnderlineColor = textDecorationUnderlineColor;
        this.textDecorationUnderlineWidth = textDecorationUnderlineWidth;
        this.textDecorationThroughlineColor = textDecorationThroughlineColor;
        this.textDecorationThroughlineWidth = textDecorationThroughlineWidth;
        this.textShadowOffsetX = textShadowOffsetX;
        this.textShadowOffsetY = textShadowOffsetY;
        this.textShadowColor = textShadowColor;
        this.textShadowBlur = textShadowBlur;
        this.color = color;
        this.font = font ? new Font(font) : undefined;
        this.haloColor = haloColor;
        this.haloSize = haloSize;
        this.horizontalAlignment = horizontalAlignment;
        this.kerning = kerning;
        this.lineHeight = lineHeight;
        this.lineWidth = lineWidth;
        this.letterSpacing = letterSpacing;
        this.lineMaxNum = lineMaxNum;
        this.textWraps = textWraps;
        this.rotated = rotated;
        this.text = text;
        this.verticalAlignment = verticalAlignment;
        this.xoffset = xoffset;
        this.yoffset = yoffset;
    }

    /**
     * 将JS对象转换为JSON格式
     * @returns {Object} 符号的实例化JSON
     */
    toJSON() {
        return {
            type: this.type,
            type: this.type,
            angle: this.angle,
            backgroundColor: this.backgroundColor,
            babackgroundPadding: backgroundPadding,
            borderLineColor: this.borderLineColor,
            borderLineSize: this.borderLineSize,
            textDecorationUnderlineColor: this.textDecorationUnderlineColor,
            textDecorationUnderlineWidth: this.textDecorationUnderlineWidth,
            textDecorationThroughlineColor: this.textDecorationThroughlineColor,
            textDecorationThroughlineWidth: this.textDecorationThroughlineWidth,
            textShadowOffsetX: this.textShadowOffsetX,
            textShadowOffsetY: this.textShadowOffsetY,
            textShadowColor: this.textShadowColor,
            textShadowBlur: this.textShadowBlur,
            color: this.color,
            font: this.font,
            haloColor: this.haloColor,
            haloSize: this.haloSize,
            horizontalAlignment: this.horizontalAlignment,
            kerning: this.kerning,
            letterSpacing: letterSpacing,
            lineMaxNum: this.lineMaxNum,
            textWraps: this.textWraps,
            lineHeight: this.lineHeight,
            lineWidth: this.lineWidth,
            rotated: this.rotated,
            text: this.text,
            verticalAlignment: this.verticalAlignment,
            xoffset: this.xoffset,
            yoffset: this.yoffset
        };
    }
}

export { TextSymbol };
mapgis.symbols.TextSymbol = TextSymbol;
