/*******************************************************************************
 * Copyright (c) 2016 Red Hat Inc. and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *   Mickael Istria (Red Hat Inc.) - initial implementation
 *******************************************************************************/
package org.eclipse.ui.internal.genericeditor;

import java.util.Collection;
import java.util.Comparator;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

import org.eclipse.core.runtime.Assert;
import org.eclipse.ui.internal.genericeditor.TextHoverRegistry.TextHoverExtension;

/**
 * A comparator that allows to sort elements according to their relative
 * placement (isBefore and isAfter)
 *
 */
class OrderedExtensionComparator implements Comparator<TextHoverExtension> {

	private Map<String, TextHoverExtension> extensionsById;

	public OrderedExtensionComparator(Collection<TextHoverExtension> extensions) {
		Assert.isNotNull(extensions);
		this.extensionsById = extensions.stream().collect(Collectors.toMap(TextHoverExtension::getId, Function.identity()));
	}

	@Override
	public int compare(TextHoverExtension arg0, TextHoverExtension arg1) {
		if (isDeclaredAsBefore(arg0, arg1) || isDeclaredAsAfter(arg1, arg0)) {
			return -1;
		}
		if (isDeclaredAsAfter(arg0, arg1) || isDeclaredAsBefore(arg1, arg0)) {
			return +1;
		}
		return arg0.toString().compareTo(arg1.toString());
	}

	private boolean isDeclaredAsBefore(TextHoverExtension arg0, TextHoverExtension arg1) {
		String before0 = arg0.getIsBefore();
		if (before0 == null) {
			return false;
		}
		if ("*".equals(before0)) { //$NON-NLS-1$
			return true;
		}
		String id1 = arg1.getId();
		if (id1 == null) {
			return false; 
		}
		if (before0.equals(id1)) {
			return true;
		}
		String after1 = arg1.getIsAfter();
		if (after1 == null) {
			return false;
		}
		return isDeclaredAsAfter(arg0, this.extensionsById.get(after1));
	}

	private boolean isDeclaredAsAfter(TextHoverExtension arg0, TextHoverExtension arg1) {
		String after0 = arg0.getIsAfter();
		if (after0 == null) {
			return false;
		}
		if ("*".equals(after0)) { //$NON-NLS-1$
			return true;
		}
		String id1 = arg1.getId();
		if (id1 == null) {
			return false; 
		}
		if (after0.equals(id1)) {
			return true;
		}
		String before1 = arg1.getIsBefore();
		if (before1 == null) {
			return false;
		}
		return isDeclaredAsAfter(arg0, this.extensionsById.get(before1));
	}

}