/*=============================================================================#
 # 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.renv;

import java.util.List;

import org.eclipse.statet.internal.r.core.renv.RLibraryLocation;


/**
 * A group of {@link RLibraryLocation R library locations}.
 */
public interface IRLibraryGroup {
	
	/** Id of R default library group */
	public static final String R_DEFAULT= "r.default"; //$NON-NLS-1$
	/** Id of R site libraries group */
	public static final String R_SITE= "r.site"; //$NON-NLS-1$
	/** Id of R user libraries group */
	public static final String R_USER= "r.user"; //$NON-NLS-1$
	/** Id of R other libraries group */
	public static final String R_OTHER= "r.common"; //$NON-NLS-1$
	
	public static final String DEFAULTLOCATION_R_DEFAULT= "${env_var:R_HOME}/library"; //$NON-NLS-1$
	
	public static final String DEFAULTLOCATION_R_SITE= "${env_var:R_HOME}/site-library"; //$NON-NLS-1$
	
	
	public interface WorkingCopy extends IRLibraryGroup {
		
		@Override
		public List<IRLibraryLocation.WorkingCopy> getLibraries();
		
		IRLibraryLocation.WorkingCopy newLibrary(String path);
		
	}
	
	
	public String getId();
	
	public String getLabel();
	
	public List<? extends IRLibraryLocation> getLibraries();
	
}
