/*******************************************************************************
 * Copyright (c) 2020 RBEI and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v. 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     Adhith Gopal - Initial API and Implementation
 *******************************************************************************/
package org.eclipse.blockchain.core.interfaces;

import java.util.Set;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IResource;

/**
 * Interface for Ethereum Project
 */
public interface IEthereumProject1 {
	/**
	 * This method is used to add the compiled solidity files to the set that is
	 * maintained in this project
	 *
	 * @param solidityFile - The compiled solidity file that belongs to this project
	 */
	public void addCompiledSolidityFiles(final IResource solidityFile);

	/**
	 * This returns a set of compiled solidity files that is part of this project
	 *
	 * @return - Set of compiled solidity files
	 */
	public Set<IResource> getCompiledSolidityFiles();

	/**
	 * Assigns the IProject to this Ethereum Project. This has to be invoked only
	 * once during creation of Ethereum Project
	 *
	 * @param project - The IProject.
	 */
	public void setProject(final IProject project);

	/**
	 * Assigns the ProjectDescription for this Ethereum Project.
	 *
	 * @param projectDescription - The Project description associated with this
	 */
	public void setProjectDescription(final IProjectDescription projectDescription);

	/**
	 * Returns the IProject associated with this Ethereum Project
	 *
	 * @return - The IProject.
	 */
	public IProject getProject();

	/**
	 *
	 * @return - The Project description associated with this project
	 */
	public IProjectDescription getProjectDescription();

	/**
	 * The file system location of the project that is associated with this.
	 *
	 * @return - File system location
	 */
	public String getProjectLocation();

	/**
	 * This method is used to add the default natures that is associated with
	 * Ethereum Project
	 */
	public void addDefaultNatures();

	/**
	 * This method is used to add the default builders that is associated with
	 * Ethereum Project
	 */
	public void addDefaultBuilders();

	/**
	 *
	 * @return - The name of the project
	 */
	public String getProjectName();

	/**
	 * This is used to assign the project builders associated with Ethereum Project.
	 *
	 * @param builderId - The builder id to add to project
	 */
	public void setProjectBuilders(String builderId);

	/**
	 * This is used to add the project nature to the list of available project
	 * nature's.
	 *
	 * @param nature - The nature to be added.
	 */
	public void setProjectNatures(final String nature);

	/**
	 *
	 * @return - Array of natures associated with this project
	 */
	public String[] getNatureIds();

	/**
	 *
	 * @return - Array of builders associated with this project
	 */
	public String[] getBuilderIds();

	/**
	 * This creates a deployment model for a smart contract that is deployed into a
	 * blockchain
	 *
	 * @param contractAddress - The contract address of the deployed SC
	 * @param scFile          - The SC resource
	 * @param lastUsedAccount - The account that was last used for performing a
	 *                        transaction
	 * @param environment     - This denotes the environment into which this SC is
	 *                        deployed(Embedded/Geth)
	 */
	public void createDeploymentModel(final String contractAddress, final IResource scFile,
			final String lastUsedAccount, final String environment);

	/**
	 *
	 * @param scFile      - The SC resource
	 * @param environment - This denotes the environment into which this SC is
	 *                    deployed(Embedded/Geth)
	 * @return - The account that was last used for performing a transaction
	 */
	public String getLastUsedAccount(final IResource scFile, final String environment);

	/**
	 * This is used to update the last used account(for transacting with blockchain)
	 *
	 * @param scFile         - The SC resource
	 * @param accountDetails - The new account that was used for transaction
	 * @param environment    - This denotes the environment into which this SC is
	 *                       deployed(Embedded/Geth)
	 */
	public void updateLastUsedAccount(final IResource scFile, final String accountDetails, final String environment);

	/**
	 *
	 * @param scFile      - The SC resource
	 * @param environment - This denotes the environment into which this SC is
	 *                    deployed(Embedded/Geth)
	 * @return - The contract address of the deployed SC
	 */
	public String getContractAddress(final IResource scFile, final String environment);

	/**
	 * This method is used to remove the SC resource from the map which holds
	 * deployed resources
	 *
	 * @param resource    - The SC resource
	 * @param environment - This denotes the environment into which this SC is
	 *                    deployed(Embedded/Geth)
	 */
	public void removeDeploymentModelForResource(final IResource resource, final String environment);

	/**
	 *
	 * @param scFile      - The SC resource
	 * @param environment - This denotes the environment into which this SC is
	 *                    deployed(Embedded/Geth)
	 * @return - Whether the SC is deployed into the passed in environment
	 */
	public boolean isSCDeployed(final IResource scFile, final String environment);
}