/*=============================================================================#
 # Copyright (c) 2010, 2017 Stephan Wahlbrink and others.
 # 
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License 2.0 which is available at
 # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
 # which is available at https://www.apache.org/licenses/LICENSE-2.0.
 # 
 # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
 # 
 # Contributors:
 #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
 #=============================================================================*/

package org.eclipse.statet.r.core.rhelp;

import java.net.URI;
import java.net.URISyntaxException;
import java.util.List;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;

import org.eclipse.statet.r.core.renv.IREnv;


/**
 * 
 */
public interface IRHelpManager {
	
	
	String PORTABLE_URL_SCHEME= "erhelp"; //$NON-NLS-1$
	String PORTABLE_URL_PREFIX= PORTABLE_URL_SCHEME + ':';
	
	String PORTABLE_DEFAULT_RENV_BROWSE_URL= PORTABLE_URL_PREFIX + "/browse/" + IREnv.DEFAULT_WORKBENCH_ENV_ID + '/'; //$NON-NLS-1$
	
	
	String getREnvHttpUrl(IREnv rEnv, String target);
	String getPackageHttpUrl(IRPkgHelp packageHelp, String target);
	
	String getPageHttpUrl(IRHelpPage page, String target);
	String getPageHttpUrl(String packageName, String pageName,
			IREnv rEnv, String target);
	
	String getTopicHttpUrl(String topic, String packageName,
			IREnv rEnv, String target);
	
	String toHttpUrl(Object object, String target);
	String toHttpUrl(String url, IREnv rEnv, String target);
	Object getContentOfUrl(String url);
	
	boolean ensureIsRunning();
	boolean isDynamic(URI url);
	URI toHttpUrl(URI url) throws URISyntaxException;
	URI toPortableUrl(URI url) throws URISyntaxException;
	
	List<IREnv> getREnvWithHelp();
	
	boolean hasHelp(IREnv rEnv);
	
	/**
	 * Returns the help for the specified R environment.
	 * The help is already locked (read lock). Call {@link IREnvHelp#unlock()} to release the lock.
	 * 
	 * @param env
	 * @return the R help
	 */
	IREnvHelp getHelp(IREnv rEnv);
	
	
	void search(RHelpSearchQuery query, IRHelpSearchRequestor requestor,
			IProgressMonitor monitor) throws CoreException;
	
}
