/*******************************************************************************
 * Copyright (c) 2005, 2017 IBM Corporation and others.
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 * 
 * SPDX-License-Identifier: EPL-2.0
 *
 *******************************************************************************/
package org.eclipse.dltk.console.ui;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

import org.eclipse.dltk.console.IScriptConsoleShell;
import org.eclipse.dltk.console.ScriptConsoleCompletionProposal;
import org.eclipse.jface.text.ITextViewer;
import org.eclipse.jface.text.contentassist.CompletionProposal;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
import org.eclipse.jface.text.contentassist.IContextInformation;
import org.eclipse.swt.graphics.Image;

public abstract class ScriptConsoleCompletionProcessor implements IContentAssistProcessor {
	protected static interface IProposalDecorator {
		String formatProposal(ScriptConsoleCompletionProposal c);

		Image getImage(ScriptConsoleCompletionProposal c);
	}

	private static IProposalDecorator defaultDecorator;

	protected IProposalDecorator getDefaultDecorator() {
		if (defaultDecorator == null) {
			defaultDecorator = new IProposalDecorator() {
				@Override
				public String formatProposal(ScriptConsoleCompletionProposal c) {
					return c.getDisplay();
				}

				@Override
				public Image getImage(ScriptConsoleCompletionProposal c) {
					return null;
				}
			};
		}

		return defaultDecorator;
	}

	private IScriptConsoleShell interpreterShell;

	public ScriptConsoleCompletionProcessor(IScriptConsoleShell interpreterShell) {
		this.interpreterShell = interpreterShell;
	}

	protected IScriptConsoleShell getInterpreterShell() {
		return this.interpreterShell;
	}

	protected List<CompletionProposal> createProposalsFromString(List<ScriptConsoleCompletionProposal> list, int offset,
			IProposalDecorator decorator) {

		if (decorator == null) {
			decorator = getDefaultDecorator();
		}

		List<CompletionProposal> result = new ArrayList<>();

		Iterator<ScriptConsoleCompletionProposal> it = list.iterator();
		while (it.hasNext()) {
			ScriptConsoleCompletionProposal c = it.next();

			CompletionProposal proposal = new CompletionProposal(c.getInsert(), // replacementString
					offset, // replacementOffset
					0, // replacementLength
					c.getInsert().length(), // cursorPosition
					decorator.getImage(c), // image
					decorator.formatProposal(c), // displayString
					null, // contextInformation
					null); // additionalContextInformation

			result.add(proposal);
		}

		Collections.sort(result, (p1, p2) -> p1.getDisplayString().compareTo(p2.getDisplayString()));

		return result;
	}

	protected abstract ICompletionProposal[] computeCompletionProposalsImpl(IScriptConsoleViewer viewer, int offset);

	protected abstract IContextInformation[] computeContextInformationImpl(ITextViewer viewer, int offset);

	@Override
	public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int offset) {
		return computeCompletionProposalsImpl((IScriptConsoleViewer) viewer, offset);
	}

	@Override
	public char[] getCompletionProposalAutoActivationCharacters() {
		return null;
	}

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

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

	@Override
	public String getErrorMessage() {
		return null;
	}
}
