/*
 * JBoss, Home of Professional Open Source
 * Copyright 2005, JBoss Inc., and individual contributors as indicated
 * by the @authors tag. See the copyright.txt in the distribution for a
 * full listing of individual contributors.
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */
package org.hibernate.eclipse.criteriaeditor;

import org.eclipse.jdt.core.CompletionContext;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.ui.text.java.CompletionProposalCollector;
import org.eclipse.jdt.ui.text.java.CompletionProposalComparator;
import org.eclipse.jdt.ui.text.java.IJavaCompletionProposal;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.text.ITextViewer;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
import org.eclipse.jface.text.contentassist.IContextInformation;
import org.eclipse.jface.text.contentassist.IContextInformationValidator;
import org.eclipse.swt.widgets.Shell;
import org.hibernate.eclipse.console.HibernateConsoleMessages;
import org.hibernate.eclipse.console.HibernateConsolePlugin;
import org.hibernate.eclipse.console.utils.ProjectUtils;
import org.hibernate.eclipse.hqleditor.CompletionHelper;
import org.hibernate.util.xpl.StringHelper;

public class JavaCompletionProcessor implements IContentAssistProcessor {

	private CompletionProposalCollector collector;

	private CriteriaEditor editor;

	private CompletionProposalComparator comparator;

	private String lastErrorMessage;

	private char[] proposalAutoActivationSet;

	public JavaCompletionProcessor(CriteriaEditor editor) {
		this.editor = editor;
		comparator = new CompletionProposalComparator();
	}

	public String getErrorMessage() {
		return lastErrorMessage;
	}

	protected void setErrorMessage(String message) {
		if ( StringHelper.isEmpty(message) ) {
			message = null;
		}
		lastErrorMessage = message;
	}

	public IContextInformationValidator getContextInformationValidator() {
		return null;
	}

	public char[] getContextInformationAutoActivationCharacters() {
		return null;
	}

	public IContextInformation[] computeContextInformation(ITextViewer viewer,
			int offset) {
		return null;
	}

	public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer,
			int position) {
		try {
			setErrorMessage( null );
			if(editor.getConsoleConfiguration()==null) {
				setErrorMessage( HibernateConsoleMessages.JavaCompletionProcessor_no_console_configuration_found );
				return new ICompletionProposal[0];
			}
			String prefix = HibernateConsoleMessages.JavaCompletionProcessor_session_session; // has to do this because of https://bugs.eclipse.org/bugs/show_bug.cgi?id=141518
			
			IJavaCompletionProposal[] results = new IJavaCompletionProposal[0];
			IJavaProject[] projects = null;
			//try {
				projects = ProjectUtils.findJavaProjects(editor.getConsoleConfiguration());
			/*} catch (RuntimeException e){
				String mess = NLS.bind(HibernateConsoleMessages.JavaCompletionProcessor_error_find_project,
						editor.getConsoleConfiguration().getName());
				HibernateConsolePlugin.getDefault().logErrorMessage(mess, e);
			}*/
			for (int i = 0; projects != null && i < projects.length && results.length <= 0; i++) {
				IJavaProject javaProject = projects[i];
				collector = new CompletionProposalCollector( javaProject );
				collector.acceptContext( new CompletionContext() );
				try {
					editor.codeComplete( prefix, collector, position, javaProject );
				}
				catch (JavaModelException x) {
					Shell shell = viewer.getTextWidget().getShell();
					ErrorDialog
							.openError(
									shell,
									HibernateConsoleMessages.JavaCompletionProcessor_error, HibernateConsoleMessages.JavaCompletionProcessor_error_while_performing_code_completion, x.getStatus() );
					HibernateConsolePlugin.getDefault().log( x );
				}
				results = collector.getJavaCompletionProposals();
			}
			
			CompletionHelper.transpose( null, -prefix.length(), results );
			
			/*if (editor.getConsoleConfiguration().getConfiguration() == null){
				ICompletionProposal[] results2 = new ICompletionProposal[results.length + 1];
				System.arraycopy(results, 0, results2, 1, results.length);
				results2[0] = new LoadConsoleCFGCompletionProposal(editor.getConsoleConfiguration());
				return results2;
			}*/
			
			return results;
		}
		finally {
			if(collector!=null) {
				setErrorMessage( collector.getErrorMessage() );
				collector = null;
			}
		}
	}

	public char[] getCompletionProposalAutoActivationCharacters() {
		return proposalAutoActivationSet;
	}

	public void setCompletionProposalAutoActivationCharacters(
			char[] activationSet) {
		proposalAutoActivationSet = activationSet;
	}

	public void orderProposalsAlphabetically(boolean order) {
		comparator.setOrderAlphabetically( order );
	}
}
