/*******************************************************************************
 * Copyright (c) 2016 Red Hat Inc. and others.
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *  Mickael Istria (Red Hat Inc.) - initial implementation
 *  Michał Niewrzał (Rogue Wave Software Inc.)
 *  Angelo Zerr <angelo.zerr@gmail.com> - fix Bug 526255
 *******************************************************************************/
package org.eclipse.lsp4e.operations.references;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.IHandler;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.lsp4e.LSPEclipseUtils;
import org.eclipse.lsp4e.LanguageServerPlugin;
import org.eclipse.lsp4e.LanguageServiceAccessor;
import org.eclipse.lsp4j.services.LanguageServer;
import org.eclipse.search.ui.NewSearchUI;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.handlers.HandlerUtil;
import org.eclipse.ui.texteditor.ITextEditor;

/**
 * LSP "Find references" handler.
 *
 */
public class LSFindReferences extends AbstractHandler implements IHandler {

	@Override
	public Object execute(ExecutionEvent event) throws ExecutionException {
		IEditorPart part = HandlerUtil.getActiveEditor(event);
		if (! (part instanceof ITextEditor)) {
			return null;
		}
		ITextEditor editor = (ITextEditor)part;
		IDocument document = LSPEclipseUtils.getDocument(editor);
		if (document == null) {
			return null;
		}
		ISelection sel = editor.getSelectionProvider().getSelection();
		if (!(sel instanceof ITextSelection)) {
			return null;
		}
		int offset = ((ITextSelection) sel).getOffset();
		LanguageServiceAccessor.getLanguageServers(document, capabilities -> LSPEclipseUtils.hasCapability(capabilities.getReferencesProvider())).thenAcceptAsync(languageServers -> {
			if (languageServers.isEmpty()) {
				return;
			}
			LanguageServer ls = languageServers.get(0);
			try {
				LSSearchQuery query = new LSSearchQuery(document, offset, ls);
				HandlerUtil.getActiveShell(event).getDisplay().asyncExec(() -> NewSearchUI.runQueryInBackground(query));
			} catch (BadLocationException e) {
				LanguageServerPlugin.logError(e);
			}
		});
		return null;
	}

	@Override
	public boolean isEnabled() {
		IEditorPart part = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
		if (!(part instanceof ITextEditor)) {
			return false;
		}
		ITextEditor editor = (ITextEditor) part;
		ISelection selection = editor.getSelectionProvider().getSelection();
		if (selection.isEmpty() || !(selection instanceof ITextSelection)) {
			return false;
		}
		try {
			return !LanguageServiceAccessor
					.getLanguageServers(LSPEclipseUtils.getDocument(editor),
							capabilities -> LSPEclipseUtils.hasCapability(capabilities.getReferencesProvider()))
					.get(50, TimeUnit.MILLISECONDS).isEmpty();
		} catch (TimeoutException | java.util.concurrent.ExecutionException e) {
			LanguageServerPlugin.logError(e);
		} catch (InterruptedException e) {
			LanguageServerPlugin.logError(e);
			Thread.currentThread().interrupt();
		}
		return false;
	}

	@Override
	public boolean isHandled() {
		return true;
	}

}
