function genPos(id, fetchData) {
	let queue = [id];

	let queueHead;

	let status = fetchData[id].visibility == 'visible'
		&& (fetchData[id].moderation_status == 'safe'
			|| fetchData[id].moderation_status == 'notreviewed'
			|| fetchData[id].moderation_status == 'notsafe');

	let pos = [{
		"id": id,
		"name": fetchData[id].title,
		"date": fetchData[id].datetime_shared,
		"user": fetchData[id].username,
		"visible": status,
		"x": '0',
		"y": 0,
		"offbranch": 0,
		"end": fetchData[id].children.length
	}];

	while (queue.length > 0) {
		queueHead = queue[0];

		let lastPosI = pos.findIndex(function (posEntry) {
			return posEntry.id == queueHead;
		});

		let children = fetchData[queueHead].children;
		queue.shift();
		if (!children || children.length == 0) continue;

		let lastPos;
		if (lastPosI > -1) {
			lastPos = pos[lastPosI];
		} else {
			continue;
		}

		children.forEach(function (child, i) {
			queue.push(child);

			let status = fetchData[child].visibility == 'visible'
				&& (fetchData[child].moderation_status == 'safe'
					|| fetchData[child].moderation_status == 'notreviewed'
					|| fetchData[child].moderation_status == 'notsafe');

			console.log(fetchData[child].moderation_status);

			pos.push({
				"id": child,
				"name": fetchData[child].title,
				"date": fetchData[child].datetime_shared,
				"user": fetchData[child].username,
				"visible": status,
				"x": lastPos.x + '|' + i,
				"y": lastPos.y + 1,
				"offbranch": 0,
				"end": (fetchData[child].children) ? fetchData[child].children.length : 0
			})

		});
	}

	return pos;
}

function sortPos(a, b) {
	let aSplit = [];
	let bSplit = [];

	a[0].split('|').forEach(function (x) {
		aSplit.push(Number(x))
	});
	b[0].split('|').forEach(function (x) {
		bSplit.push(Number(x))
	});

	let h = 0;
	aSplit.forEach(function (x, i) {
		if (h == 0 && x - bSplit[i] != 0) {
			h = x - bSplit[i];
		}
	})

	if (h == 0) {
		return (aSplit.length > bSplit.length) ? 1 : -1;
	}

	return h;
}


async function main(fetchData) {
	let rootId = fetchData['root_id'];

	let pos = genPos(rootId, fetchData);

	let posX = [];

	pos.forEach(function (posEntry) {
		posX.push([posEntry.x, posEntry.end]);
	})

	let posReduc = posX.reduce(function (a, b) {
		if (a.indexOf(b[0]) < 0) a.push(b);
		return a;
	}, []);


	posReduc.sort(sortPos);

	let i = 0;
	posReduc.forEach(function (posEntry, j) {
		posReduc[j] = [posEntry[0], i, posEntry[1]];
		let splitty = posEntry[0].split('|');
		let lastSplitty = splitty.pop();

		if (lastSplitty != '0') {
			i++;
			posReduc[j][1] = i;
		}
	});

	pos.forEach(function (posEntry, j) {
		let i = posReduc.findIndex(function (x) {
			return x[0] == posEntry.x
		});
		if (i != -1) {
			pos[j].x = posReduc[i][1];
			let extended = posReduc[i][0] + '|' + (posReduc[i][2] - 1);
			let indexB = posReduc.findIndex(function (x) {
				return x[0] == extended
			});
			if (indexB > -1) {
				pos[j].offbranch = (posReduc[indexB][1] - posReduc[i][1]);
			}
		}
	})

	return pos;
}