import { Utils } from '../common/Utils';

const __ = {
	private: Symbol('private'),
}

/**
 * 层级控制器
 * BaseLevelControl 类是一个基础层级控制类,用于管理层级的进入和退出。
 * @memberof THING
 * @public
 */
class BaseLevelControl {

	/**
	 * 构造函数
	 * @param {object} options - 配置参数
	 * @param {boolean} [options.isEnabled=true] - 是否启用
	 */
	constructor(options = {}) {
		const _private = this[__.private] = {};
		_private.isRunning = false;
		_private.isEnabled = Utils.parseBoolean(options['isEnabled'], true);
		_private.options = options;
	}

	/**
	 * 启用
	 * @param {object} param - 参数
	 */
	enable(param) {
		const _private = this[__.private];

		_private.isEnabled = true;

		if (_private.isRunning) {
			return;
		}

		const current = param['current'];
		if (!current) {
			return;
		}

		const condition = _private.options['condition']
		if (!current.test(condition)) {
			return;
		}

		_private.isRunning = true;
		this.onEnable(param);
	}

	/**
	 * 禁用
	 * @param {object} param - 参数
	 */
	disable(param) {
		const _private = this[__.private];
		if (!_private.isEnabled) {
			return;
		}

		_private.isEnabled = false;

		if (!_private.isRunning) {
			return;
		}

		this.onDisable(param);

		_private.isRunning = false;
	}

	/**
	 * 进入层级
	 * </br>当进入层级时调用。
	 * @param {object} param - 进入层级的参数。
	 */
	onEnter(param) {
		const _private = this[__.private];
		_private.isRunning = true;
	}

	/**
	 * 退出层级
	 * </br>当离开层级时调用。
	 * @param {object} param - 离开层级的参数。
	 */
	onLeave(param) {
		const _private = this[__.private];
		_private.isRunning = false;
	}

	/**
	 * 开启事件的回调
	 * </br>当层级没有切换,有需要切换层级控制时触发
	 */
	onEnable() {
	}

	/**
	 * 关闭事件的回调
	 * </br>当层级没有切换,有需要切换层级控制时触发
	 */
	onDisable() {
	}

	/**
	 * 获取是否正在运行
	 * @type {boolean}
	 */
	get isRunning() {
		let _private = this[__.private];
		return _private.isRunning;
	}

	/**
	 * 获取是否启用
	 * @type {boolean}
	 */
	get isEnabled() {
		let _private = this[__.private];
		return _private.isEnabled;
	}

	/**
	 * 获取配置参数
	 * @type {object}
	 */
	get options() {
		let _private = this[__.private];
		return _private.options;
	}

	get isBaseLevelControl() {
		return true;
	}

}

export { BaseLevelControl };