/*******************************************************************************
 * Copyright (c) 2017 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.)
 *******************************************************************************/
package org.eclipse.ui.internal.genericeditor.hover;

import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map.Entry;

import org.eclipse.jface.text.AbstractReusableInformationControlCreator;
import org.eclipse.jface.text.DefaultInformationControl;
import org.eclipse.jface.text.IInformationControl;
import org.eclipse.jface.text.IInformationControlCreator;
import org.eclipse.jface.text.IInformationControlCreatorExtension;
import org.eclipse.jface.text.ITextHover;
import org.eclipse.jface.text.ITextHoverExtension;
import org.eclipse.swt.widgets.Shell;

public class CompositeInformationControlCreator
		implements IInformationControlCreator, IInformationControlCreatorExtension {

	private final LinkedHashMap<ITextHover, IInformationControlCreator> creators;

	public CompositeInformationControlCreator(List<ITextHover> hovers) {
		this.creators = new LinkedHashMap<>();
		for (ITextHover hover : hovers) {
			creators.put(hover, getInformationControlCreator(hover));
		}
	}

	public CompositeInformationControlCreator(LinkedHashMap<ITextHover, IInformationControlCreator> creators) {
		this.creators = creators;
	}

	private static IInformationControlCreator getInformationControlCreator(ITextHover hover) {
		IInformationControlCreator controlCreator = null;
		if (hover instanceof ITextHoverExtension) {
			controlCreator = ((ITextHoverExtension)hover).getHoverControlCreator();
		}
		if (controlCreator == null) {
			controlCreator = new AbstractReusableInformationControlCreator() {
				@Override
				protected IInformationControl doCreateInformationControl(Shell parent) {
					return new DefaultInformationControl(parent, true);
				}
			};
		}
		return controlCreator;
	}


	@Override
	public boolean canReuse(IInformationControl control) {
		if (control.getClass() != CompositeInformationControl.class) {
			return false;
		}
		CompositeInformationControl other = (CompositeInformationControl)control;
		if (!other.creators.equals(this.creators)) {
			return false;
		}
		Iterator<Entry<ITextHover, IInformationControlCreator>> thisIterator = this.creators.entrySet().iterator();
		Iterator<Entry<ITextHover, IInformationControl>> otherIterator = other.controls.entrySet().iterator();
		do {
			Entry<ITextHover, IInformationControlCreator> thisEntry = thisIterator.next();
			Entry<ITextHover, IInformationControl> otherEntry = otherIterator.next();
			if (!thisEntry.getKey().equals(otherEntry.getKey())) {
				return false;
			}
			if (!(thisEntry.getValue() instanceof IInformationControlCreatorExtension)) {
				return false;
			}
			if (!((IInformationControlCreatorExtension)thisEntry.getValue()).canReuse(otherEntry.getValue())) {
				return false;
			}
		} while (thisIterator.hasNext());
		return true;
	}

	@Override
	public boolean canReplace(IInformationControlCreator creator) {
		if (creator.getClass() != this.getClass()) {
			return false;
		}
		CompositeInformationControlCreator other = (CompositeInformationControlCreator)creator;
		if (other.creators.size() != this.creators.size()) {
			return false;
		}
		Iterator<Entry<ITextHover, IInformationControlCreator>> thisIterator = this.creators.entrySet().iterator();
		Iterator<Entry<ITextHover, IInformationControlCreator>> otherIterator = other.creators.entrySet().iterator();
		do {
			Entry<ITextHover, IInformationControlCreator> thisEntry = thisIterator.next();
			Entry<ITextHover, IInformationControlCreator> otherEntry = otherIterator.next();
			if (!thisEntry.getKey().equals(otherEntry.getKey())) {
				return false;
			}
			if (!(thisEntry.getValue() instanceof IInformationControlCreatorExtension)) {
				return false;
			}
			if (!((IInformationControlCreatorExtension)thisEntry.getValue()).canReplace(otherEntry.getValue())) {
				return false;
			}
		} while (thisIterator.hasNext());
		return true;
	}
	

	@Override
	public IInformationControl createInformationControl(Shell parent) {
		return new CompositeInformationControl(parent, this.creators);
	}

}
