package org.apache.maven.shared.release.config;

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

import java.util.List;

import org.apache.maven.model.Scm;

/**
 * 
 * @author Robert Scholte
 */
public interface ReleaseDescriptor
{
    /**
     * Get if updateDependencies is false, dependencies version won't be updated to the next development version.
     * 
     * @return boolean
     */
    boolean isUpdateDependencies();

    /**
     * Get whether to use the release profile that adds sources and javadocs to the released artifact, if appropriate.
     * If set to true, this will set the property "performRelease" to true.
     * 
     * @return boolean
     */
    boolean isUseReleaseProfile();

    /**
     * Get whether to use the parent pom version for submodule versions.
     * 
     * @return boolean
     */
    boolean isAutoVersionSubmodules();

    /**
     * Get whether a SNAPSHOT of the release plugin is allowed.
     * 
     * @return boolean
     */
    boolean isSnapshotReleasePluginAllowed();

    /**
     * Get the commits must be done by modules or not. Set it to true in case of flat directory structure.
     * 
     * @return boolean
     */
    boolean isCommitByProject();

    /**
     * Get whether to create a branch instead of do a release.
     * 
     * @return boolean
     */
    boolean isBranchCreation();

    /**
     * Get whether to update branch POM versions.
     * 
     * @return boolean
     */
    boolean isUpdateBranchVersions();

    /**
     * Get whether to update working copy POM versions.
     * 
     * @return boolean
     */
    boolean isUpdateWorkingCopyVersions();

    /**
     * Get whether to suppress a commit of changes to the working copy before a tag or branch is created.
     * 
     * @return boolean
     */
    boolean isSuppressCommitBeforeTagOrBranch();

    /**
     * Get should timestamped SNAPSHOT dependencies be allowed? Default is to fail when any SNAPSHOT dependency is
     * found.
     * 
     * @return boolean
     */
    boolean isAllowTimestampedSnapshots();

    /**
     * Get whether to update branch versions to SNAPSHOT.
     * 
     * @return boolean
     */
    boolean isUpdateVersionsToSnapshot();

    /**
     * Get nOTE : currently only implemented with svn scm. Enable a workaround to prevent issue due to svn client >
     * 1.5.0 (http://jira.codehaus.org/browse/SCM-406).
     * 
     * @return boolean
     */
    boolean isRemoteTagging();

    /**
     * Get if the scm provider should use local checkouts via file://${basedir} instead of doing a clean checkout over
     * the network. This is very helpful for releasing large projects!
     * 
     * @return boolean
     */
    boolean isLocalCheckout();

    /**
     * Get should distributed changes be pushed to the central repository? For many distributed SCMs like Git, a change
     * like a commit is only stored in your local copy of the repository. Pushing the change allows your to more easily
     * share it with other users.
     * 
     * @return boolean
     */
    boolean isPushChanges();

    /**
     * Get default version to use for new working copy.
     * 
     * @return String
     */
    String getDefaultDevelopmentVersion();

    /**
     * Get relative path of the project returned by the checkout command.
     * 
     * @return String
     */
    String getScmRelativePathProjectDirectory();

    /**
     * Get the directory where the tag will be checked out.
     * 
     * @return String
     */
    String getCheckoutDirectory();

    /**
     * Get the goals to execute in perform phase for the release.
     * 
     * @return String
     */
    String getPerformGoals();

    /**
     * Get default version to use for the tagged release or the new branch.
     * 
     * @return String
     */
    String getDefaultReleaseVersion();

    /**
     * Get nOTE : currently only implemented with svn scm. It contains the revision of the committed released pom to
     * remotely tag the source code with this revision.
     * 
     * @return String
     */
    String getScmReleasedPomRevision();

    /**
     * Get whether to add the model schema to the top of the rewritten POM if it wasn't there already. If
     * <code>false</code> then the root element will remain untouched.
     * 
     * @return boolean
     */
    boolean isAddSchema();

    /**
     * Get whether to generate release POMs.
     * 
     * @return boolean
     */
    boolean isGenerateReleasePoms();

    /**
     * Get whether the release process is interactive and the release manager should be prompted to confirm values, or
     * whether the defaults are used regardless.
     * 
     * @return boolean
     */
    boolean isInteractive();

    /**
     * Get whether to use edit mode when making SCM modifications. This setting is disregarded if the SCM does not
     * support edit mode, or if edit mode is compulsory for the given SCM.
     * 
     * @return boolean
     */
    boolean isScmUseEditMode();

    /**
     * 
     * @return list of profiles to activate
     */
    List<String> getActivateProfiles();

    /**
     * Get the last completed phase.
     * 
     * @return String
     */
    String getCompletedPhase();

    /**
     * Method getCheckModificationExcludes.
     * 
     * @return List
     */
    List<String> getCheckModificationExcludes();

    /**
     * Get additional arguments to pass to any executed Maven process.
     * 
     * @return String
     */
    String getAdditionalArguments();

    /**
     * Get the goals to execute in preparation for the release.
     * 
     * @return String
     */
    String getPreparationGoals();

    /**
     * Get the goals to execute in on completion of preparation for the release.
     * 
     * @return String
     */
    String getCompletionGoals();

    /**
     * Get the file name of the POM to pass to any executed Maven process.
     * 
     * @return String
     */
    String getPomFileName();

    /**
     * Get the prefix of SCM modification messages.
     * 
     * @return String
     */
    String getScmCommentPrefix();

    /**
     * Get pass phrase for the private key.
     * 
     * @return String
     */
    String getScmPrivateKeyPassPhrase();

    /**
     * Get the password for the user interacting with the scm.
     * 
     * @return String
     */
    String getScmPassword();

    /**
     * Get private key for an SSH based SCM repository.
     * 
     * @return String
     */
    String getScmPrivateKey();

    /**
     * Get tag or branch name: the identifier for the tag/branch. Example: maven-release-plugin-2.0.
     * 
     * @return String
     */
    String getScmReleaseLabel();

    /**
     * Get where you are going to put your tagged sources Example https://svn.apache.org/repos/asf/maven/plugins/tags.
     * 
     * @return String
     */
    String getScmTagBase();

    /**
     * Get where you are going to put your branched sources Example
     * https://svn.apache.org/repos/asf/maven/plugins/branches.
     * 
     * @return String
     */
    String getScmBranchBase();

    /**
     * Get the id can be used to get the credentials by the server-id from the settings.xml.
     * 
     * @return String
     */
    String getScmId();

    /**
     * Get this is a MavenSCM of where you're going to get the sources to make the release with. Example:
     * scm:svn:https://svn.apache.org/repos/asf/maven/plugins/trunk/maven-release-plugin.
     * 
     * @return String
     */
    String getScmSourceUrl();

    /**
     * Get the user name to interact with the scm.
     * 
     * @return String
     */
    String getScmUsername();

    /**
     * Get wait the specified number of seconds before creating a tag.
     * 
     * @return int
     */
    int getWaitBeforeTagging();

    /**
     * Get the directory where the release is performed.
     * 
     * @return String
     */
    String getWorkingDirectory();

    /**
     * Get specifies the format for generating a tag name. Property expansion is used with the optional prefix of
     * project, where properties are delimited with @{ and }.
     * 
     * @return String
     */
    String getScmTagNameFormat();

    /**
     * Get the role-hint for the NamingPolicy implementation used to calculate the project branch and tag names.
     * 
     * @return String
     */
    String getProjectNamingPolicyId();

    /**
     * Get the role-hint for the VersionPolicy implementation used to calculate the project versions.
     * 
     * @return String
     */
    String getProjectVersionPolicyId(); 

    /**
     * Get the role-hint for the release Strategy implementation.
     * 
     * @return String
     */
    String getReleaseStrategyId();

    /**
     * Retrieve the original version for the resolved snapshot dependency.
     *
     */
    String getDependencyOriginalVersion( String artifactKey );
    
    /**
     * Retrieve the release version for the resolved snapshot dependency.
     *
     */
    String getDependencyReleaseVersion( String artifactKey ); 

    /**
     * Retrieve the release version for the resolved snapshot dependency.
     *
     */
    String getDependencyDevelopmentVersion( String artifactKey ); 

    
    String getProjectOriginalVersion( String projectKey );

    String getProjectDevelopmentVersion( String projectKey );

    String getProjectReleaseVersion( String key );

    /**
     * Method getOriginalScmInfo.
     * 
     * @return Map
     */
    Scm getOriginalScmInfo( String projectKey );

    // Modifiable
    void addDependencyOriginalVersion( String versionlessKey, String string );

    void addDependencyReleaseVersion( String versionlessKey, String version ); 
    
    void addDependencyDevelopmentVersion( String versionlessKey, String version );

    void addReleaseVersion( String projectId, String nextVersion );

    void addDevelopmentVersion( String projectId, String nextVersion );

    void setScmReleaseLabel( String tag );

    void setScmReleasedPomRevision( String scmRevision );

    void setScmRelativePathProjectDirectory( String scmRelativePathProjectDirectory );

    void setScmSourceUrl( String scmUrl );


}
