package org.bndtools.headless.build.manager.api;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Set;

import org.bndtools.api.NamedPlugin;
import org.osgi.annotation.versioning.ConsumerType;

/**
 * <p>
 * The interface of a headless build plugin.
 * </p>
 * <p>
 * A headless build plugin can generate files in the cnf project and all bnd
 * projects so that they can be built using the corresponding headless build
 * tooling.
 * </p>
 */
@ConsumerType
public interface HeadlessBuildPlugin {
	/**
	 * @return generic plugin information
	 */
	NamedPlugin getInformation();

	/**
	 * Setup/remove files enabling headless build of a project.
	 *
	 * @param cnf true when the project directory is that of the cnf project
	 * @param projectDir the project directory
	 * @param add true to add/create the files, false to remove them
	 * @param enabledIgnorePlugins set with enabled version control ignore
	 *            plugins
	 * @throws IOException upon error(s)
	 */
	@Deprecated
	void setup(boolean cnf, File projectDir, boolean add, Set<String> enabledIgnorePlugins) throws IOException;

	void setup(boolean cnf, File projectDir, boolean add, Set<String> enabledIgnorePlugins, List<String> warnings)
		throws IOException;

	// Future expansion of the interface: automatic management of template files
	//
	// public enum HeadlessBuildFileStatus {
	// NONE, UPDATE, ADD, REMOVE;
	// }
	//
	// public interface HeadlessBuildFileInfo {
	// String getBuildFile();
	//
	// File getFile();
	//
	// HeadlessBuildFileStatus getFileStatus();
	// }
	//
	// List<HeadlessBuildFileInfo> check(boolean cnf, File projectDir) throws
	// IOException;
	//
	// InputStream getBuildFile(boolean cnf, File projectDir,
	// HeadlessBuildFileInfo fileInfo) throws IOException;
	//
	// void update(boolean cnf, File projectDir, List<HeadlessBuildFileInfo>
	// fileInfos) throws IOException;
}
