import { Utils } from '../common/Utils';
import { AppDelegate } from '../objects/AppDelegate';
import { MouseEventManager } from '../managers/MouseEventManager';

/**
 * @class EventCaptureComponent
 * 事件捕获组件。
 * @memberof THING
 * @public
 */
class EventCaptureComponent {

	constructor(options = {}) {
		this._delegate = options.delegate || AppDelegate.current;

		this._object = null;

		this._domElement = null;

		this._enable = true;
		this._enablePropagation = true;

		this._mouseEventManager = null;

		this._delta = null;

		this._onTriggerEvent = null;
	}

	// #region Private

	_unregisterEvents() {
		// Dispose previous mouse event manager
		if (this._mouseEventManager) {
			this._mouseEventManager.dispose();
			this._mouseEventManager = null;
		}
	}

	_registerEvents() {
		let domElement = this._domElement;

		// Create mouse event manager to hook DOM element events
		this._mouseEventManager = new MouseEventManager({
			domElement,
			onTriggerEvent: (ev) => {
				if (!this._enable) {
					return;
				}

				let event = Utils.buildMouseEvent(domElement, ev);

				let moveDelta = this._mouseEventManager.moveDelta;
				event.deltaX = moveDelta[0];
				event.deltaY = moveDelta[1];

				if (this._onTriggerEvent) {
					this._onTriggerEvent(event);
				}

				if (!this._enablePropagation) {
					ev.stopPropagation();
				}
			}
		});
	}

	// #endregion

	// #region Overrides

	onAdd(object) {
		this._object = object;
	}

	onRemove() {
		this._unregisterEvents();
	}

	// #endregion

	get object() {
		return this._object;
	}

	/**
	 * 启用/禁用。
	 * @type {boolean}
	 * @public
	 */
	get enable() {
		return this._enable;
	}
	set enable(value) {
		this._enable = value;
	}

	/**
	 * 启用/禁用事件传播,默认值为 true(启用事件传播)。
	 * @type {boolean}
	 * @public
	 */
	get enablePropagation() {
		return this._enablePropagation;
	}
	set enablePropagation(value) {
		this._enablePropagation = value;
	}

	/**
	 * 获取/设置 DOM 元素。
	 * @type {object}
	 * @public
	 */
	get domElement() {
		return this._domElement;
	}
	set domElement(value) {
		this._unregisterEvents();

		this._domElement = value;

		// Make cursor as default when hover on it
		let style = this._domElement.style;
		style.cursor = 'default';
		style.pointerEvents = 'all';

		this._registerEvents();
	}

	/**
	 * 获取/设置触发事件回调函数。
	 * @type {Function}
	 * @public
	 */
	get onTriggerEvent() {
		return this._onTriggerEvent;
	}
	set onTriggerEvent(value) {
		this._onTriggerEvent = value;
	}

}

export { EventCaptureComponent }