package org.apache.maven.execution;

/*
 * 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.io.File;
import java.util.Date;
import java.util.List;
import java.util.Properties;

import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
import org.apache.maven.model.Profile;
import org.apache.maven.project.ProjectBuildingRequest;
import org.apache.maven.settings.Mirror;
import org.apache.maven.settings.Proxy;
import org.apache.maven.settings.Server;
import org.codehaus.plexus.logging.Logger;
import org.sonatype.aether.RepositoryCache;
import org.sonatype.aether.repository.WorkspaceReader;
import org.sonatype.aether.transfer.TransferListener;

/**
 * @author Jason van Zyl
 */
public interface MavenExecutionRequest
{
    // ----------------------------------------------------------------------
    // Logging
    // ----------------------------------------------------------------------

    final int LOGGING_LEVEL_DEBUG = Logger.LEVEL_DEBUG;

    final int LOGGING_LEVEL_INFO = Logger.LEVEL_INFO;

    final int LOGGING_LEVEL_WARN = Logger.LEVEL_WARN;

    final int LOGGING_LEVEL_ERROR = Logger.LEVEL_ERROR;

    final int LOGGING_LEVEL_FATAL = Logger.LEVEL_FATAL;

    final int LOGGING_LEVEL_DISABLED = Logger.LEVEL_DISABLED;

    // ----------------------------------------------------------------------
    // Reactor Failure Mode
    // ----------------------------------------------------------------------

    final String REACTOR_FAIL_FAST = "FAIL_FAST";

    final String REACTOR_FAIL_AT_END = "FAIL_AT_END";

    final String REACTOR_FAIL_NEVER = "FAIL_NEVER";

    // ----------------------------------------------------------------------
    // Reactor Make Mode
    // ----------------------------------------------------------------------

    final String REACTOR_MAKE_UPSTREAM = "make-upstream";

    final String REACTOR_MAKE_DOWNSTREAM = "make-downstream";

    final String REACTOR_MAKE_BOTH = "make-both";

    // ----------------------------------------------------------------------
    // Artifact repository policies
    // ----------------------------------------------------------------------

    final String CHECKSUM_POLICY_FAIL = ArtifactRepositoryPolicy.CHECKSUM_POLICY_FAIL;

    final String CHECKSUM_POLICY_WARN = ArtifactRepositoryPolicy.CHECKSUM_POLICY_WARN;

    // ----------------------------------------------------------------------
    //
    // ----------------------------------------------------------------------

    // Base directory
    MavenExecutionRequest setBaseDirectory( File basedir );
    String getBaseDirectory();

    // Timing (remove this)
    MavenExecutionRequest setStartTime( Date start );
    Date getStartTime();

    // Goals
    MavenExecutionRequest setGoals( List<String> goals );
    List<String> getGoals();

    // Properties

    /**
     * Sets the system properties to use for interpolation and profile activation. The system properties are collected
     * from the runtime environment like {@link System#getProperties()} and environment variables.
     *
     * @param systemProperties The system properties, may be {@code null}.
     * @return This request, never {@code null}.
     */
    MavenExecutionRequest setSystemProperties( Properties systemProperties );

    /**
     * Gets the system properties to use for interpolation and profile activation. The system properties are collected
     * from the runtime environment like {@link System#getProperties()} and environment variables.
     *
     * @return The system properties, never {@code null}.
     */
    Properties getSystemProperties();

    /**
     * Sets the user properties to use for interpolation and profile activation. The user properties have been
     * configured directly by the user on his discretion, e.g. via the {@code -Dkey=value} parameter on the command
     * line.
     *
     * @param userProperties The user properties, may be {@code null}.
     * @return This request, never {@code null}.
     */
    MavenExecutionRequest setUserProperties( Properties userProperties );

    /**
     * Gets the user properties to use for interpolation and profile activation. The user properties have been
     * configured directly by the user on his discretion, e.g. via the {@code -Dkey=value} parameter on the command
     * line.
     *
     * @return The user properties, never {@code null}.
     */
    Properties getUserProperties();

    // Reactor
    MavenExecutionRequest setReactorFailureBehavior( String failureBehavior );
    String getReactorFailureBehavior();

    MavenExecutionRequest setSelectedProjects( List<String> projects );
    List<String> getSelectedProjects();

    MavenExecutionRequest setResumeFrom( String project );
    String getResumeFrom();

    MavenExecutionRequest setMakeBehavior( String makeBehavior );
    String getMakeBehavior();

    void setThreadCount( String threadCount );
    String getThreadCount();
    boolean isThreadConfigurationPresent();
    void setPerCoreThreadCount( boolean perCoreThreadCount );
    boolean isPerCoreThreadCount();

    // Recursive (really to just process the top-level POM)
    MavenExecutionRequest setRecursive( boolean recursive );
    boolean isRecursive();

    MavenExecutionRequest setPom( File pom );
    File getPom();

    // Errors
    MavenExecutionRequest setShowErrors( boolean showErrors );
    boolean isShowErrors();

    // Transfer listeners
    MavenExecutionRequest setTransferListener( TransferListener transferListener );
    TransferListener getTransferListener();

    // Logging
    MavenExecutionRequest setLoggingLevel( int loggingLevel );
    int getLoggingLevel();

    // Update snapshots
    MavenExecutionRequest setUpdateSnapshots( boolean updateSnapshots );
    boolean isUpdateSnapshots();

    MavenExecutionRequest setNoSnapshotUpdates( boolean noSnapshotUpdates );
    boolean isNoSnapshotUpdates();

    // Checksum policy
    MavenExecutionRequest setGlobalChecksumPolicy( String globalChecksumPolicy );
    String getGlobalChecksumPolicy();

    // Local repository
    MavenExecutionRequest setLocalRepositoryPath( String localRepository );
    MavenExecutionRequest setLocalRepositoryPath( File localRepository );
    File getLocalRepositoryPath();
    MavenExecutionRequest setLocalRepository( ArtifactRepository repository );
    ArtifactRepository getLocalRepository();

    // Interactive
    MavenExecutionRequest setInteractiveMode( boolean interactive );
    boolean isInteractiveMode();

    // Offline
    MavenExecutionRequest setOffline( boolean offline );
    boolean isOffline();

    boolean isCacheTransferError();
    MavenExecutionRequest setCacheTransferError( boolean cacheTransferError );

    boolean isCacheNotFound();
    MavenExecutionRequest setCacheNotFound( boolean cacheNotFound );

    // Profiles
    List<Profile> getProfiles();
    MavenExecutionRequest addProfile( Profile profile );
    MavenExecutionRequest setProfiles( List<Profile> profiles );
    MavenExecutionRequest addActiveProfile( String profile );
    MavenExecutionRequest addActiveProfiles( List<String> profiles );
    MavenExecutionRequest setActiveProfiles( List<String> profiles );
    List<String> getActiveProfiles();
    MavenExecutionRequest addInactiveProfile( String profile );
    MavenExecutionRequest addInactiveProfiles( List<String> profiles );
    MavenExecutionRequest setInactiveProfiles( List<String> profiles );
    List<String> getInactiveProfiles();

    // Proxies
    List<Proxy> getProxies();
    MavenExecutionRequest setProxies( List<Proxy> proxies );
    MavenExecutionRequest addProxy( Proxy proxy );

    // Servers
    List<Server> getServers();
    MavenExecutionRequest setServers( List<Server> servers );
    MavenExecutionRequest addServer( Server server );

    // Mirrors
    List<Mirror> getMirrors();
    MavenExecutionRequest setMirrors( List<Mirror> mirrors );
    MavenExecutionRequest addMirror( Mirror mirror );

    // Plugin groups
    List<String> getPluginGroups();
    MavenExecutionRequest setPluginGroups( List<String> pluginGroups );
    MavenExecutionRequest addPluginGroup( String pluginGroup );
    MavenExecutionRequest addPluginGroups( List<String> pluginGroups );

    boolean isProjectPresent();
    MavenExecutionRequest setProjectPresent( boolean isProjectPresent );

    File getUserSettingsFile();
    MavenExecutionRequest setUserSettingsFile( File userSettingsFile );

    File getGlobalSettingsFile();
    MavenExecutionRequest setGlobalSettingsFile( File globalSettingsFile );

    MavenExecutionRequest addRemoteRepository( ArtifactRepository repository );
    MavenExecutionRequest addPluginArtifactRepository( ArtifactRepository repository );

    /**
     * Set a new list of remote repositories to use the execution request. This is necessary if you perform
     * transformations on the remote repositories being used. For example if you replace existing repositories with
     * mirrors then it's easier to just replace the whole list with a new list of transformed repositories.
     *
     * @param repositories
     * @return
     */
    MavenExecutionRequest setRemoteRepositories( List<ArtifactRepository> repositories );
    List<ArtifactRepository> getRemoteRepositories();

    MavenExecutionRequest setPluginArtifactRepositories( List<ArtifactRepository> repositories );
    List<ArtifactRepository> getPluginArtifactRepositories();

    MavenExecutionRequest setRepositoryCache( RepositoryCache repositoryCache );
    RepositoryCache getRepositoryCache();

    WorkspaceReader getWorkspaceReader();
    MavenExecutionRequest setWorkspaceReader( WorkspaceReader workspaceReader );

    File getUserToolchainsFile();
    MavenExecutionRequest setUserToolchainsFile( File userToolchainsFile );

    ExecutionListener getExecutionListener();
    MavenExecutionRequest setExecutionListener( ExecutionListener executionListener );

    ProjectBuildingRequest getProjectBuildingRequest();

}
