/*******************************************************************************
 * Copyright (c) 2020 Martin Weber.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/

package org.eclipse.cdt.cmake.core.properties;

import java.util.List;

/**
 * Holds project Properties for cmake.
 *
 * @author Martin Weber
 */
public interface ICMakeProperties {

	/**
	 * {@code -Wno-dev}
	 */
	boolean isWarnNoDev();

	/**
	 * {@code -Wno-dev}
	 */
	void setWarnNoDev(boolean warnNoDev);

	/**
	 * {@code --debug-trycompile}
	 */
	boolean isDebugTryCompile();

	/**
	 * {@code --debug-trycompile}
	 */
	void setDebugTryCompile(boolean debugTryCompile);

	/**
	 * {@code --debug-output}
	 */
	boolean isDebugOutput();

	/**
	 * {@code --debug-output}
	 */
	void setDebugOutput(boolean debugOutput);

	/**
	 * {@code --trace}
	 */
	boolean isTrace();

	/**
	 * {@code --trace}
	 */
	void setTrace(boolean trace);

	/**
	 * {@code --warn-uninitialized}
	 */
	boolean isWarnUnitialized();

	/**
	 * {@code --warn-uninitialized}
	 */
	void setWarnUnitialized(boolean warnUnitialized);

	/**
	 * {@code --warn-unused-vars}
	 */
	boolean isWarnUnused();

	/**
	 * {@code --warn-unused-vars}
	 */
	void setWarnUnused(boolean warnUnused);

	/** Gets the build type ({@code Debug}, {@code Release}, ...). The returned value is passed to cmake
	 * as the {@code CMAKE_BUILD_TYPE} symbol on the command-line.
	 *
	 * @return the build type String. If <code>null</code> or {@link String#isBlank() blank}, no
	 * {@code CMAKE_BUILD_TYPE} symbol argument will be given to cmake, causing it to use its
	 * default build-type.
	 */
	String getBuildType();

	/** Sets the build type.
	 * @param buildType the build type to set. May be <code>null</code> or {@link String#isBlank() blank}.
	 * @see #getBuildType()
	 */
	void setBuildType(String buildType);

	/**
	 * Gets the list of extra arguments to pass on the cmake command-line.
	 *
	 * @return a unmodifiable list, never {@code null}
	 *
	 */
	List<String> getExtraArguments();

	/**
	 * Sets the list of extra arguments to pass on the cmake command-line.
	 */
	void setExtraArguments(List<String> extraArguments);

	/**
	 * Gets the name of the file that is used to pre-populate the cmake cache.
	 * {@code -C}
	 *
	 * @return the file name to set. If <code>null</code> or {@link String#isBlank() blank}, the cmake cache shall not be
	 *         pre-populated.
	 */
	String getCacheFile();

	/**
	 * Sets the name of the file that is used to pre-populate the cmake cache.
	 * {@code -C}
	 *
	 * @param cacheFile
	 *          the file name.  May be <code>null</code> or {@link String#isBlank() blank}.
	 * @see #getCacheFile()
	 */
	void setCacheFile(String cacheFile);

	/** Gets whether to clear the cmake-cache before build. If set to <code>true</code>, this will force to run cmake
	 * prior to each build.
	 */
	boolean isClearCache();

	/** Sets whether to clear the cmake-cache before build.
	 */
	void setClearCache(boolean clearCache);

	/**
	 * Gets the override/augmenting properties to apply when the build runs on linux.
	 */
	IOsOverrides getLinuxOverrides();

	/**
	 * Gets the override/augmenting properties to apply when the build runs on windows.
	 */
	IOsOverrides getWindowsOverrides();

	/**
	 * Sets each property to its default value. This is intended for UIs that wish to implement a restore-defaults feature.<br>
	 *
	 * @param resetOsOverrides
	 * 		  whether to also reset the OS-specific overrides ({@link #getLinuxOverrides()},
	 * 		  {@link #getWindowsOverrides()}). If the overrides are displayed in separate tabs in the UI, <code>false</code>
	 * 		  should be specified.
	 */
	void reset(boolean resetOsOverrides);
}