var vectorUtil = require("../../utils/vector_util");

/* eslint-disable no-unused-vars */

/**
 * @abstract
 * @class qrenderer.graphic.drag.Draggable
 * 
 * 
 * 
 * 提供拖拽功能,所有需要拖拽功能的元素都可以混入此类的实现。此实现依赖事件机制,混入此实现的类需要预先混入 eventful 接口。
 * @author 大漠穷秋 <damoqiongqiu@126.com>
 * @docauthor 大漠穷秋 <damoqiongqiu@126.com>
 */
var Draggable = function Draggable() {
  /**
   * @property {Boolean} draggable
   * Whether it can be dragged.
   */
  this.draggable = false;
  /**
   * @property {Boolean} dragging
   * Whether is it dragging.
   */

  this.dragging = false;
};

Draggable.prototype = {
  constructor: Draggable,

  /**
   * @method beforeMove
   * 
   * 
   * 
   * 钩子函数,在元素发生移动之前执行。
   * 如果 beforeMove 返回 false ,元素不会发生移动,API 调用者可以利用此钩子实现复杂的控制。
   */
  beforeMove: function beforeMove(dx, dy, event, el) {
    return true;
  },

  /**
   * @method move
   * 
   * Move element
   * 
   * 移动元素
   * 
   * @param  {Number} dx dx on the global space.
   * @param  {Number} dy dy on the global space.
   * @param  {Event} event event object.
   */
  move: function move(dx, dy, event) {
    this.trigger("beforeMove", this);

    switch (this.draggable) {
      case 'horizontal':
        dy = 0;
        break;

      case 'vertical':
        dx = 0;
        break;
    }

    this.trigger("moving", this); //TODO:trigger moving event when animating the position property.

    vectorUtil.add(this.position, this.position, [dx, dy]);
    this.dirty();
    this.trigger("afterMove", this);
    this.afterMove();
  },

  /**
   * @method afterMove
   * 钩子函数,在元素发生移动之后执行。
   */
  afterMove: function afterMove(dx, dy, event, el) {}
};
var _default = Draggable;
module.exports = _default;