const { size } = require('../../constants/view');

const margin = size / 10;
const step = size + (2 * margin);

function nodesIntersect(a, b) {
	if (a.x === undefined || a.y === undefined || b.x === undefined || b.y === undefined) {
		return undefined;
	}

	return (((a.x - size - margin) < b.x) && (b.x < (a.x + size + margin))) &&
		(((a.y - size - margin) < b.y) && (b.y < (a.y + size + margin)));
}

module.exports = class LayoutEngine {
	constructor(graphViewProps) {
		this.graphViewProps = graphViewProps;
	}

	calculatePosition(node) {
		return node;
	}

	adjustNodes(nodes) {
		nodes.forEach(node => {
			if (node.type === 'satellite') {
				return;
			}

			if (node.x !== undefined) {
				return;
			}

			if (node.type === 'source') {
				node.x = 0 * step;
			} else if (node.type === 'sink') {
				node.x = 8 * step;
			} else {
				node.x = (2 * step) + ((node.index % 5) * step);
			}

			node.y = 0;

			for (const otherNode of nodes) {
				if (otherNode.type === 'satellite') {
					continue;
				}

				if (otherNode === node) {
					continue;
				}

				if (nodesIntersect(node, otherNode)) {
					node.y += size + margin;
				}
			}
		});

		return nodes;
	}

	getPositionForNode(node) {
		return this.calculatePosition(node);
	}
};