/*******************************************************************************
 * Copyright (c) 2011 Mia-Software and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v20.html
 *
 * Contributors:
 *     Nicolas Bros (Mia-Software) - Bug 335003 - [Discoverer] : Existing Discoverers Refactoring based on new framework
 *******************************************************************************/
package org.eclipse.modisco.usecase.modelfilter.dependencies.ui.internal.handlers;

import java.io.IOException;
import java.util.Iterator;

import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.modisco.infra.common.core.logging.MoDiscoLogger;
import org.eclipse.modisco.infra.discovery.core.exception.DiscoveryException;
import org.eclipse.modisco.java.Package;
import org.eclipse.modisco.java.Type;
import org.eclipse.modisco.java.discoverer.DiscoverJavaModelFromJavaProject;
import org.eclipse.modisco.java.discoverer.JavaModelUtils;
import org.eclipse.modisco.java.discoverer.internal.core.JavaJdtBridge;
import org.eclipse.modisco.usecase.modelfilter.dependencies.ui.internal.Activator;
import org.eclipse.modisco.usecase.modelfilter.dependencies.ui.internal.Messages;
import org.eclipse.modisco.usecase.modelfilter.dependencies.ui.internal.editor.DependenciesEditor;
import org.eclipse.modisco.usecase.modelfilter.dependencies.ui.internal.editor.PrefuseGraphInput;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.handlers.HandlerUtil;
import org.eclipse.ui.ide.IDE;

public class DisplayDependenciesHandler extends AbstractHandler {
	public DisplayDependenciesHandler() {
	}

	public Object execute(final ExecutionEvent event) throws ExecutionException {
		ISelection selection = HandlerUtil.getCurrentSelection(event);
		if (selection instanceof IStructuredSelection) {
			IStructuredSelection structuredSelection = (IStructuredSelection) selection;
			Iterator<?> iterator = structuredSelection.iterator();
			while (iterator.hasNext()) {
				Object object = iterator.next();
				open(object);
			}
		}
		return null;
	}

	private static void open(final Object object) {
		if (object instanceof IJavaProject) {
			final IJavaProject javaProject = (IJavaProject) object;
			openOn(javaProject);
		} else if (object instanceof IFile) {
			IFile file = (IFile) object;
			if (JavaModelUtils.isJavaModelFile(file)) {
				openOn(file);
			} else {
				MoDiscoLogger
						.logWarning("Not a Java model: " //$NON-NLS-1$
								+ file.getFullPath().toString(),
								Activator.getDefault());
			}
		} else if (object instanceof IType) {
			IType type = (IType) object;
			IJavaProject javaProject = type.getJavaProject();
			openOn(type, javaProject);
		} else if (object instanceof ICompilationUnit) {
			ICompilationUnit compilationUnit = (ICompilationUnit) object;
			String typeName = compilationUnit.getPath().removeFileExtension()
					.lastSegment();
			IType type = compilationUnit.getType(typeName);
			IJavaProject javaProject = type.getJavaProject();
			openOn(type, javaProject);
		} else if (object instanceof IPackageFragment) {
			IPackageFragment packageFragment = (IPackageFragment) object;
			openOn(packageFragment, packageFragment.getJavaProject());
		} else {
			MoDiscoLogger.logWarning("Input not handled: " //$NON-NLS-1$
					+ object.getClass().getName(), Activator.getDefault());
		}

	}

	private static void openOn(final IPackageFragment packageFragment,
			final IJavaProject javaProject) {
		Job job = new Job(
				Messages.DisplayDependenciesHandler_discoverJavaProject) {
			@Override
			protected IStatus run(final IProgressMonitor monitor) {
				try {
					DiscoverJavaModelFromJavaProject discoverer = new DiscoverJavaModelFromJavaProject();
					discoverer.discoverElement(javaProject,
							new NullProgressMonitor());
					Resource resource = discoverer.getTargetModel();

					JavaJdtBridge bridge = new JavaJdtBridge();
					Package modelPackage = bridge.getJavaPackage(resource,
							packageFragment);
					if (modelPackage != null) {
						PrefuseGraphInput prefuseGraphInput = new PrefuseGraphInput(
								modelPackage, javaProject);
						openPrefuseEditor(prefuseGraphInput);
					}
				} catch (DiscoveryException e) {
					MoDiscoLogger.logError(e, Activator.getDefault());
					return Status.CANCEL_STATUS;
				}
				return Status.OK_STATUS;
			}
		};
		job.schedule();
	}

	private static void openOn(final IType type, final IJavaProject javaProject) {
		Job job = new Job(
				Messages.DisplayDependenciesHandler_discoverJavaProject) {
			@Override
			protected IStatus run(final IProgressMonitor monitor) {
				try {
					DiscoverJavaModelFromJavaProject discoverer = new DiscoverJavaModelFromJavaProject();
					discoverer.discoverElement(javaProject,
							new NullProgressMonitor());
					Resource targetModel = discoverer.getTargetModel();

					JavaJdtBridge bridge = new JavaJdtBridge();
					Type modelType = bridge.getJavaType(targetModel, type);
					if (modelType != null) {
						PrefuseGraphInput prefuseGraphInput = new PrefuseGraphInput(
								modelType, javaProject);
						openPrefuseEditor(prefuseGraphInput);
					}
				} catch (DiscoveryException e) {
					MoDiscoLogger.logError(e, Activator.getDefault());
					return Status.CANCEL_STATUS;
				}
				return Status.OK_STATUS;
			}
		};
		job.schedule();
	}

	private static void openOn(final IFile file) {
		Job job = new Job(Messages.DisplayDependenciesHandler_openJavaModelFile) {
			@Override
			protected IStatus run(final IProgressMonitor monitor) {
				try {
					ResourceSet resourceSet = new ResourceSetImpl();
					Resource resource = resourceSet.createResource(URI
							.createPlatformResourceURI(file.getFullPath()
									.toString(), true));
					resource.load(null);
					PrefuseGraphInput input = new PrefuseGraphInput(resource,
							JavaCore.create(file.getProject()));
					openPrefuseEditor(input);
				} catch (IOException e) {
					MoDiscoLogger.logError(e, Activator.getDefault());
					return Status.CANCEL_STATUS;
				}
				return Status.OK_STATUS;
			}
		};
		job.schedule();
	}

	private static void openOn(final IJavaProject javaProject) {
		Job job = new Job(
				Messages.DisplayDependenciesHandler_discoverJavaProject) {
			@Override
			protected IStatus run(final IProgressMonitor monitor) {
				try {
					DiscoverJavaModelFromJavaProject discoverer = new DiscoverJavaModelFromJavaProject();
					discoverer.discoverElement(javaProject,
							new NullProgressMonitor());
					Resource targetModel = discoverer.getTargetModel();
					PrefuseGraphInput input = new PrefuseGraphInput(
							targetModel, javaProject);
					openPrefuseEditor(input);
				} catch (DiscoveryException e) {
					MoDiscoLogger.logError(e, Activator.getDefault());
					return Status.CANCEL_STATUS;
				}
				return Status.OK_STATUS;
			}
		};
		job.schedule();
	}

	protected static void openPrefuseEditor(final IEditorInput editorInput) {
		Display.getDefault().asyncExec(new Runnable() {
			public void run() {
				try {
					IWorkbenchPage page = PlatformUI.getWorkbench()
							.getActiveWorkbenchWindow().getActivePage();
					IDE.openEditor(page, editorInput,
							DependenciesEditor.EDITOR_ID, true);
				} catch (PartInitException e) {
					MoDiscoLogger.logError(e, Activator.getDefault());
				}
			}
		});
	}
}
