/*******************************************************************************
 * Copyright (c) 2012, 2013 Sierra Wireless 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:
 *     Sierra Wireless - initial API and implementation
 *******************************************************************************/
package org.eclipse.ldt.ui.internal.editor.text;

import java.io.IOException;

import org.eclipse.core.runtime.PlatformObject;
import org.eclipse.dltk.annotations.Internal;
import org.eclipse.dltk.core.IModelElement;
import org.eclipse.dltk.internal.ui.text.HTMLPrinter;
import org.eclipse.dltk.internal.ui.text.hover.DocumentationHover;
import org.eclipse.dltk.ui.ScriptElementImageProvider;
import org.eclipse.dltk.ui.ScriptElementLabels;
import org.eclipse.dltk.ui.documentation.IDocumentationResponse;
import org.eclipse.dltk.ui.documentation.IScriptDocumentationTitleAdapter;
import org.eclipse.dltk.ui.documentation.ScriptDocumentationAccess;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.text.IInformationControlCreator;
import org.eclipse.ldt.ui.internal.LuaDocumentationHelper;

@SuppressWarnings("restriction")
public class LuaDocumentationHover extends DocumentationHover {

	private static final long LABEL_FLAGS = ScriptElementLabels.ALL_FULLY_QUALIFIED | ScriptElementLabels.M_APP_RETURNTYPE
			| ScriptElementLabels.F_APP_TYPE_SIGNATURE | ScriptElementLabels.M_PARAMETER_TYPES | ScriptElementLabels.M_PARAMETER_NAMES
			| ScriptElementLabels.M_EXCEPTIONS | ScriptElementLabels.F_PRE_TYPE_SIGNATURE | ScriptElementLabels.M_PRE_TYPE_PARAMETERS
			| ScriptElementLabels.T_TYPE_PARAMETERS | ScriptElementLabels.USE_RESOLVED;
	private static final long LOCAL_VARIABLE_FLAGS = LABEL_FLAGS & ~ScriptElementLabels.F_FULLY_QUALIFIED | ScriptElementLabels.F_POST_QUALIFIED;

	private static final ScriptDocumentationTitleAdapter titleAdapter = new ScriptDocumentationTitleAdapter();

	@Internal
	static class ScriptDocumentationTitleAdapter extends PlatformObject implements IScriptDocumentationTitleAdapter {

		private ScriptElementImageProvider fImageProvider;

		public String getTitle(Object element) {
			if (element instanceof IModelElement) {
				IModelElement member = (IModelElement) element;
				long flags = member.getElementType() == IModelElement.LOCAL_VARIABLE ? LOCAL_VARIABLE_FLAGS : LABEL_FLAGS;
				String label = ScriptElementLabels.getDefault().getElementLabel(member, flags);
				return label;
			} else {
				return null;
			}
		}

		public ImageDescriptor getImage(Object element) {
			if (element instanceof IModelElement) {
				final IModelElement modelElement = (IModelElement) element;
				if (fImageProvider == null) {
					fImageProvider = new ScriptElementImageProvider();
				}
				return fImageProvider.getScriptImageDescriptor(modelElement, ScriptElementImageProvider.OVERLAY_ICONS
						| ScriptElementImageProvider.SMALL_ICONS);
			}
			return null;
		}
	}

	private IInformationControlCreator fHoverControlCreator;

	@Override
	protected String getHoverInfo(String nature, Object[] result) {
		String htmlContent = null;

		// no result
		int nResults = result.length;
		if (nResults == 0)
			return null;

		if (nResults > 0) {
			// handle only the first result
			Object element = result[0];

			// try to get documentation
			IDocumentationResponse response = ScriptDocumentationAccess.getDocumentation(nature, element, titleAdapter);
			if (response != null) {
				try {
					htmlContent = HTMLPrinter.read(response.getReader());
				} catch (IOException e) {
					return null;
				}
			}

			// if no documentation, don't display any tooltip
			if (htmlContent == null || htmlContent.isEmpty()) {
				// TODO BUG_ECLIPSE 399414 and/or 399468
				// Because DLTK have a default tooltip really hard to remove, the only way to
				// don't have a tooltip is to kill the thread responsible to display the hover by throwing an exception.
				throw new RuntimeException("Exception to avoid to create a tooltip, currently a workaround for dltk"); //$NON-NLS-1$
				// return null;
			}
			return LuaDocumentationHelper.generatePage(htmlContent);
		}

		return null;
	}

	@Override
	public IInformationControlCreator getHoverControlCreator() {
		if (fHoverControlCreator == null)
			fHoverControlCreator = new LuaHoverControlCreator(getInformationPresenterControlCreator());
		return fHoverControlCreator;
	}

}
