/*******************************************************************************
 * Copyright (c) 2010 BestSolution.at 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:
 * Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation
 * Steven Spungin <steven@spungin.tv> - Bug 424730, Bug 436281, Bug 436280
 ******************************************************************************/
package org.eclipse.e4.tools.emf.editor3x;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.e4.tools.emf.ui.common.IClassContributionProvider;
import org.eclipse.e4.tools.emf.ui.common.ResourceSearchScope;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.search.IJavaSearchConstants;
import org.eclipse.jdt.core.search.IJavaSearchScope;
import org.eclipse.jdt.core.search.SearchEngine;
import org.eclipse.jdt.core.search.SearchPattern;
import org.eclipse.jdt.core.search.TypeNameRequestor;
import org.eclipse.pde.internal.core.util.PDEJavaHelper;

@SuppressWarnings("restriction")
public class PDEClassContributionProvider implements IClassContributionProvider {
	private final SearchEngine searchEngine;

	public PDEClassContributionProvider() {
		searchEngine = new SearchEngine();
	}

	@Override
	public void findContribution(final Filter filter, final ContributionResultHandler handler) {
		boolean followReferences = true;
		if (filter.getSearchScope().contains(ResourceSearchScope.PROJECT)
			&& !filter.getSearchScope().contains(ResourceSearchScope.REFERENCES)) {
			followReferences = false;
		}

		IJavaSearchScope scope = null;
		if (followReferences == false) {
			final IJavaProject javaProject = JavaCore.create(filter.project);
			IPackageFragmentRoot[] roots;
			try {
				roots = javaProject.getPackageFragmentRoots();
				scope = SearchEngine.createJavaSearchScope(roots, false);
			} catch (final JavaModelException e) {
				e.printStackTrace();
			}
		} else {
			// filter.project may be null in the live editor
			scope = filter.project != null ? PDEJavaHelper
				.getSearchScope(filter.project) : SearchEngine
				.createWorkspaceScope();
		}
		char[] packageName = null;
		char[] typeName = null;
		String currentContent = filter.namePattern;
		final int index = currentContent.lastIndexOf('.');

		if (index == -1) {
			// There is no package qualification
			// Perform the search only on the type name
			typeName = currentContent.toCharArray();
			if (currentContent.startsWith("*")) { //$NON-NLS-1$
				if (!currentContent.endsWith("*")) { //$NON-NLS-1$
					currentContent += "*"; //$NON-NLS-1$
				}
				typeName = currentContent.toCharArray();
				packageName = "*".toCharArray(); //$NON-NLS-1$
			}

		} else if (index + 1 == currentContent.length()) {
			// There is a package qualification and the last character is a
			// dot
			// Perform the search for all types under the given package
			// Pattern for all types
			typeName = "".toCharArray(); //$NON-NLS-1$
			// Package name without the trailing dot
			packageName = currentContent.substring(0, index).toCharArray();
		} else {
			// There is a package qualification, followed by a dot, and
			// a type fragment
			// Type name without the package qualification
			typeName = currentContent.substring(index + 1).toCharArray();
			// Package name without the trailing dot
			packageName = currentContent.substring(0, index).toCharArray();
		}

		// char[] packageName = "at.bestsolution.e4.handlers".toCharArray();
		// char[] typeName = "*".toCharArray();

		final TypeNameRequestor req = new TypeNameRequestor() {
			@Override
			public void acceptType(int modifiers, char[] packageName, char[] simpleTypeName,
				char[][] enclosingTypeNames, String path) {
				// Accept search results from the JDT SearchEngine
				final String cName = new String(simpleTypeName);
				final String pName = new String(packageName);
				//				String label = cName + " - " + pName; //$NON-NLS-1$
				final String content = pName.length() == 0 ? cName : pName + "." + cName; //$NON-NLS-1$

				// System.err.println("Found: " + label + " => " + pName + " => " + path);

				final IResource resource = ResourcesPlugin.getWorkspace().getRoot().findMember(path);

				if (resource != null) {
					final IProject project = resource.getProject();
					final IFile f = project.getFile("/META-INF/MANIFEST.MF"); //$NON-NLS-1$

					if (f != null && f.exists()) {
						BufferedReader r = null;
						try {
							final InputStream s = f.getContents();
							r = new BufferedReader(new InputStreamReader(s));
							String line;
							while ((line = r.readLine()) != null) {
								if (line.startsWith("Bundle-SymbolicName:")) { //$NON-NLS-1$
									final int start = line.indexOf(':');
									int end = line.indexOf(';');
									if (end == -1) {
										end = line.length();
									}
									final ContributionData data = new ContributionData(line.substring(start + 1, end)
										.trim(), content, "Java", null); //$NON-NLS-1$
									handler.result(data);
									break;
								}
							}

						} catch (final CoreException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						} catch (final IOException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						} finally {
							if (r != null) {
								try {
									r.close();
								} catch (final IOException e) {
									// TODO Auto-generated catch block
									e.printStackTrace();
								}
							}
						}
					}
				}

				// Image image = (Flags.isInterface(modifiers)) ?
				// PDEPluginImages.get(PDEPluginImages.OBJ_DESC_GENERATE_INTERFACE) :
				// PDEPluginImages.get(PDEPluginImages.OBJ_DESC_GENERATE_CLASS);
				// addProposalToCollection(c, startOffset, length, label, content, image);
			}
		};

		try {
			searchEngine.searchAllTypeNames(
				packageName,
				SearchPattern.R_PATTERN_MATCH,
				typeName,
				SearchPattern.R_PATTERN_MATCH | SearchPattern.R_CAMELCASE_MATCH,
				IJavaSearchConstants.CLASS,
				scope,
				req,
				IJavaSearchConstants.WAIT_UNTIL_READY_TO_SEARCH, null);
		} catch (final JavaModelException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		handler.moreResults(0, filter);
	}

}
