Source: managers/RelationshipManager.js

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

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

/**
 * @class RelationshipManager
 * The relationship manager.
 * @memberof THING
 */
class RelationshipManager {

	/**
	 * The relationship manager to manage object(s) life.
	 */
	constructor() {
		this[__.private] = {};
		let _private = this[__.private];

		_private.relationships = [];
	}

	addRelationship(relationship) {
		let _private = this[__.private];

		_private.relationships.push(relationship);
		this.notifyObjectAddRelationship(relationship.source, relationship);
		this.notifyObjectAddRelationship(relationship.target, relationship);
	}

	removeRelationship(relationship) {
		let _private = this[__.private];

		Utils.removeFromArray(_private.relationships, relationship);
		this.notifyObjectRemoveRelationship(relationship.source, relationship);
		this.notifyObjectRemoveRelationship(relationship.target, relationship);
	}

	notifyObjectAddRelationship(object, relationship) {
		if (object) {
			if (Utils.isArray(object)) {
				object.forEach((object) => {
					object.addRelationship(relationship);
				})
			} else {
				object.addRelationship(relationship);
			}
		}
	}

	notifyObjectRemoveRelationship(object, relationship) {
		if (object) {
			if (Utils.isArray(object)) {
				object.forEach((object) => {
					object.removeRelationship(relationship);
				})
			} else {
				object.removeRelationship(relationship);
			}
		}
	}

	notifyRelationshipRemoveObject(relationship, object) {
		relationship.releaseObject(object);
	}

	queryRelationships(options = {}) {
		let _private = this[__.private];

		let result = [];

		result = _private.relationships.filter((relationship) => {
			return relationship.test(options);
		})

		return result;
	}

	dispose() {
		let _private = this[__.private];

		_private.relationships.forEach(relationship => {
			relationship.destroy();
		});
		_private.relationships = [];
	}

	get relationships() {
		let _private = this[__.private];

		return _private.relationships;
	}
}

export { RelationshipManager }