/*******************************************************************************
 * Copyright (c) 2008, 2009 IBM Corporation 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:
 * IBM - Initial API and implementation
 *******************************************************************************/
package org.eclipse.ptp.internal.rdt.core.subsystems;

import java.util.List;

import org.eclipse.cdt.core.index.IIndexFileLocation;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.ptp.internal.rdt.core.IRemoteIndexerInfoProvider;
import org.eclipse.ptp.internal.rdt.core.callhierarchy.CalledByResult;
import org.eclipse.ptp.internal.rdt.core.callhierarchy.CallsToResult;
import org.eclipse.ptp.internal.rdt.core.contentassist.Proposal;
import org.eclipse.ptp.internal.rdt.core.contentassist.RemoteContentAssistInvocationContext;
import org.eclipse.ptp.internal.rdt.core.includebrowser.IIndexIncludeValue;
import org.eclipse.ptp.internal.rdt.core.index.RemoteIndexerTask;
import org.eclipse.ptp.internal.rdt.core.model.Scope;
import org.eclipse.ptp.internal.rdt.core.navigation.OpenDeclarationResult;
import org.eclipse.ptp.internal.rdt.core.search.RemoteSearchMatch;
import org.eclipse.ptp.internal.rdt.core.search.RemoteSearchQuery;
import org.eclipse.ptp.internal.rdt.core.typehierarchy.THGraph;



/**
 * @author crecoskie
 * 
 * Provides index related services from a remote host.
 * 
 * This interface is implemented by the indexing subsystem.  It is not meant to be implemented by clients.
 * 
 * It is expected that there is only one ICIndexSubsystem active on a given connector service.
 *
 */
public interface ICIndexSubsystem {

	/**
	 * Checks the state of the given project to ensure it is indexing services
	 * for it is initialized and consistent.
	 * 
	 * @param project
	 * @param monitor
	 */
	public void checkProject(IProject project, IProgressMonitor monitor);
	
	/**
	 * Checks the state of all the projects in the workspace to ensure
	 * indexing services for them are all initialized and consistent.
	 * 
	 * @param monitor
	 */
	public void checkAllProjects(IProgressMonitor monitor);

	// index management

	/**
	 * Re-indexes the given scope.
	 * 
	 * As a precaution the index location is taken as a parameter to ensure
	 * that the index file is always generated in the correct location.
	 * 
	 * @param scope
	 * @param monitor
	 * @param indexLocation Path to the location of the index file.
	 * @param task that this operation originates from
	 * @return IStatus indicating success or failure
	 */
	public IStatus reindexScope(Scope scope, IRemoteIndexerInfoProvider provider, String indexLocation, IProgressMonitor monitor, RemoteIndexerTask task);
	
	/**
	 * Incrementally indexes based on a delta of added, changed, and removed elements.  Valid elements can be
	 * of type ITranslationUnit, ICContainer, or ICProject. 
	 * 
	 * @param scope
	 * @param newElements
	 * @param changedElements
	 * @param deletedElements
	 * @param monitor
	 * @param task that this operation originates from
	 * @return IStatus indicating success or failure
	 */
	public IStatus indexDelta(Scope scope, IRemoteIndexerInfoProvider provider,	List<ICElement> newElements, List<ICElement> changedElements, 
			List<ICElement> deletedElements, IProgressMonitor monitor, RemoteIndexerTask task);
	
	
	// scope management
	/**
	 * Registers a scope for later reference.
	 * 
	 * @param scope
	 * @param elements The elements which comprise the scope.  Valid element types are ITranslationUnit, ICContainer, and ICProject
	 * @param indexLocation The path of the directory that contains the index file.
	 * @param monitor
	 * @return IStatus indicating success or failure.
	 */
	public IStatus registerScope(Scope scope, List<ICElement> elements, String indexLocation, IProgressMonitor monitor);
	
	/**
	 * Unregisters a scope.  Effectively, the scope manager will remove it from its list of managed scopes.
	 * 
	 * @param scope
	 * @param monitor
	 * @return
	 */
	public IStatus unregisterScope(Scope scope, IProgressMonitor monitor);
	
	/**
	 * Remove index file on remote host.
	 * 
	 * @param scope
	 * @param monitor
	 * @return
	 */
	public IStatus removeIndexFile(Scope scope, IProgressMonitor monitor);


	// call hierarchy service
	/**
	 * Gets the callers of a given selection.  This method will only succeed if the selection corresponds to
	 * a function, method, or constructor.
	 * 
	 * @param scope
	 * @param subject The ICElement that is the subject of the operation.
	 * @param monitor
	 */
	public CalledByResult getCallers(Scope scope, ICElement subject, IProgressMonitor monitor);
	
	/**
	 * Gets the callees of a given selection.  This method will only succeed if the selection corresponds to
	 * a function, method, or constructor.
	 * 
	 * @param scope
	 * @param subject The name of the ICElement that is the subject of the operation.
	 * @param filePath The path to the file in which the subject resides.
	 * @param selectionStart The offset into the file at which the subject was selected.
	 * @param selectionLength The length of the selection in which the subject was selected.
	 * @param monitor
	 */	
	public CallsToResult getCallees(Scope scope, ICElement subject, IProgressMonitor monitor);
	
	/**
	 * Gets the definition of the element in a given selection.
	 * 
	 * @param scope
	 * @param subject The name of the ICElement that is the subject of the operation.
	 * @param monitor
	 * @return the ICElements corresponding to each known definition of the subject.
	 */
	public ICElement[] getCHDefinitions(Scope scope, ICElement subject, IProgressMonitor monitor);
	
	/**
	 * Gets the definition of the element in a given selection.
	 * 
	 * @param scope
	 * @param unit The ITranslationUnit that contains the selection
	 * @param selectionStart The offset into the translation unit at which the subject was selected.
	 * @param selectionLength The length of the selection in which the subject was selected.
	 * @param monitor
	 * @return the ICElements corresponding to each known definition of the subject.
	 */
	public ICElement[] getCHDefinitions(Scope scope, ITranslationUnit unit, int selectionStart, int selectionLength, IProgressMonitor pm);
	
	/**
	 * Runs the following search query and returns the results.
	 * 
	 * @param scope
	 * @param query The query to be run.
	 * @param monitor
	 * @return A List of RemoteSearchMatch objects containing the search results.
	 */
	public List<RemoteSearchMatch> runQuery(Scope scope, RemoteSearchQuery query, IProgressMonitor monitor);

	/**
	 * Returns content assist completion proposals for the given context.
	 * 
	 * @param scope
	 * @param context describes the conditions under which content assist was
	 *                invoked.
	 * @param unit the translation unit in which content assist was invoked.
	 * @return completion proposals for the given context.
	 */
	public List<Proposal> computeCompletionProposals(Scope scope, RemoteContentAssistInvocationContext context, ITranslationUnit unit);

	/**
	 * Returns the supertype and subtype graph for the class associated with
	 * with given input.
	 * 
	 * @param scope
	 * @param input the element for which a supertype and subtype graph should be
	 *              computed.
	 * @param monitor
	 * @return
	 */
	public THGraph computeTypeGraph(Scope scope, ICElement input, IProgressMonitor monitor);

	/**
	 * Returns a pair of <code>ICElement</code>s corresponding to the
	 * definition of the associated type of the given input, as well as the
	 * definition of the input.
	 * 
	 * @param scope
	 * @param input the element from which the associated type will be computed.
	 * @return
	 */
	public ICElement[] findTypeHierarchyInput(Scope scope, ICElement input);

	/**
	 * Returns a pair of <code>ICElement</code>s corresponding to the
	 * definition of the parent type of the given selection in the
	 * <code>ITranslationUnit</code>, as well as the definition of the
	 * selection.
	 * 
	 * @param scope
	 * @param unit the <code>ITranslationUnit</code> that should be searched.
	 * @param selectionStart the character offset of the selection.
	 * @param selectionLength the total characters in the selection.
	 * @return
	 */
	public ICElement[] findTypeHierarchyInput(Scope scope, ITranslationUnit unit, int selectionStart, int selectionLength);

	/**
	 * Returns a list of names that represent the declarations of the 
	 * given selection in the ITranslationUnit.
	 *  
	 * @param scope
	 * @param unit the <code>ITranslationUnit</code> that should be searched.
	 * @param selectedText used as a fallback for searching the index
	 * @param selectionStart the character offset of the selection.
	 * @param selectionLength the total characters in the selection.
	 * @param monitor
	 * @return
	 */
	public OpenDeclarationResult openDeclaration(Scope scope, ITranslationUnit unit, String selectedText, int selectionStart, int selectionLength, IProgressMonitor monitor);
	
	
	public IIndexIncludeValue[] findIncludesTo(Scope scope, IIndexFileLocation location, IProgressMonitor monitor);
	
	public IIndexIncludeValue[] findIncludedBy(Scope scope, IIndexFileLocation location, IProgressMonitor monitor);

	public boolean isIndexed(Scope scope, IIndexFileLocation location, IProgressMonitor monitor);
	
	public IIndexIncludeValue findInclude(Scope scope, IIndexFileLocation location, String name, int offset, IProgressMonitor monitor);
	
	/**
	 * Returns a model built using the content of the given translation unit
	 * @param unit
	 * @param monitor
	 * @return
	 */
	public ITranslationUnit getModel(ITranslationUnit unit, IProgressMonitor monitor);

	public String moveIndexFile(String scopeName, String newIndexLocation, IProgressMonitor monitor);

}
