    import Id from '../other/id';

    /** @module svgObjects.Tag */

    /**
     * Parent class for all svgObjects
     */
    export default class Tag {
        /**
         * @param {string} tagName SVG tag identifier (`rect`, `image`, `PolyLine`)
         */
        constructor(tagName) {
            /**
             * SVG tag identifier (`rect`, `image`, `PolyLine`)
             * @type {string}
             */
            this.tagName = tagName;

            /**
             * jQuery element for this tag
             * @type {jQuery.element}
             */
            this.$el = $('<' + this.tagName + '>');

            /**
             * unique ID of this SVG object
             * @type {string}
             */
            this.id = new Id().unique;
        }

        /**
         * add a class to this element
         * @param {string} name class name to be added
         */
        addClass(name) {
            this.$el.addClass(name);
        }

        /**
         * remove class names from this element
         * @param  {string} classes class names to be removed
         */
        removeClasses(...classes) {
            for (let item of classes) {
                this.$el.removeClass(item);
            }
        }

        /**
         * set attributes of this element
         * @param {Object} assoc javascript object that will be mapped into attributes (`{key: value}` -> `key="value"`)
         */
        addAttr(assoc) {
            this.checkIfElementExistsInDOM();

            // add attributes to the element
            this.$el.attr(assoc);
        }

        /**
         * get attribute value by name
         * @param  {string} name name of the attribute
         * @return {string}      value of the attribute
         */
        getAttr(name) {
            this.checkIfElementExistsInDOM();

            return this.$el.attr(name);
        }

        /**
         * remove attribute by value
         * @param  {string} name name of the attribute to be removed
         */
        removeAttr(name) {
            this.checkIfElementExistsInDOM();

            this.$el.removeAttr(name);
        }

        /**
         * set id of this SVG object
         * @param  {string} id new id for this object
         */
        set id(id) {
            this.addAttr({ id: id });
        }

        /**
         * get id of this SVG object
         * @return {string}
         */
        get id() {
            return this.getAttr('id');
        }

        /**
         * get jQuery element for this SVG object
         * @return {jQuery.element}
         */
        get() {
            this.checkIfElementExistsInDOM();
            return this.$el;
        }

        /**
         * check if the element exists in dom, if so, refetch it from DOM using jQuery
         */
        checkIfElementExistsInDOM() {
            let $jqElement = $('#' + this.$el.attr('id'));
            if ($jqElement.length) {
                this.$el = $jqElement;
            }
        }
    }