package org.apache.continuum.distributed.transport.slave;

/*
 * 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 com.atlassian.xmlrpc.ServiceObject;

import java.util.List;
import java.util.Map;
import java.util.Properties;

/**
 * SlaveBuildAgentTransportService
 */
@ServiceObject( "SlaveBuildAgentTransportService" )
public interface SlaveBuildAgentTransportService
{
    public Boolean buildProjects( List<Map<String, Object>> projectsBuildContext )
        throws Exception;

    public Map<String, Object> getBuildResult( int projectId )
        throws Exception;

    public Map<String, Object> getProjectCurrentlyBuilding()
        throws Exception;

    public List<Map<String, String>> getAvailableInstallations()
        throws Exception;

    public Boolean ping()
        throws Exception;

    public Boolean cancelBuild()
        throws Exception;

    public String generateWorkingCopyContent( int projectId, String directory, String baseUrl, String imagesBaseUrl )
        throws Exception;

    public Map<String, Object> getProjectFile( int projectId, String directory, String filename )
        throws Exception;

    public Map getReleasePluginParameters( int projectId, String pomFilename )
        throws Exception;

    public List<Map<String, String>> processProject( int projectId, String pomFilename, boolean autoVersionSubmodules )
        throws Exception;

    public String releasePrepare( Map project, Properties properties, Map releaseVersion, Map developmentVersion,
                                  Map environments, String username )
        throws Exception;

    public Map<String, Object> getReleaseResult( String releaseId )
        throws Exception;

    public Map<String, Object> getListener( String releaseId )
        throws Exception;

    public Boolean removeListener( String releaseId )
        throws Exception;

    public String getPreparedReleaseName( String releaseId )
        throws Exception;

    public Boolean releasePerform( String releaseId, String goals, String arguments, boolean useReleaseProfile,
                                   Map repository, String username )
        throws Exception;

    public String releasePerformFromScm( String goals, String arguments, boolean useReleaseProfile, Map repository,
                                         String scmUrl, String scmUsername, String scmPassword, String scmTag,
                                         String scmTagBase, Map environments, String username )
        throws Exception;

    public String releaseCleanup( String releaseId )
        throws Exception;

    public Boolean releaseRollback( String releaseId, int projectId )
        throws Exception;

    public Integer getBuildSizeOfAgent()
        throws Exception;

    public List<Map<String, Object>> getProjectsInPrepareBuildQueue()
        throws Exception;

    public List<Map<String, Object>> getProjectsAndBuildDefinitionsInPrepareBuildQueue()
        throws Exception;

    public List<Map<String, Object>> getProjectsInBuildQueue()
        throws Exception;

    public Map<String, Object> getProjectCurrentlyPreparingBuild()
        throws Exception;

    public List<Map<String, Object>> getProjectsAndBuildDefinitionsCurrentlyPreparingBuild()
        throws Exception;

    public Boolean isProjectGroupInQueue( int projectGroupId )
        throws Exception;

    public Boolean isProjectScmRootInQueue( int projectScmRootId, List<Integer> projectIds )
        throws Exception;

    public Boolean isProjectCurrentlyBuilding( int projectId, int buildDefinitionId )
        throws Exception;

    public Boolean isProjectInBuildQueue( int projectId, int buildDefinitionId )
        throws Exception;

    public Boolean isProjectCurrentlyPreparingBuild( int projectId, int buildDefinitionId )
        throws Exception;

    public Boolean isProjectInPrepareBuildQueue( int projectId, int buildDefinitionId )
        throws Exception;

    public Boolean isProjectGroupInPrepareBuildQueue( int projectGroupId )
        throws Exception;

    public Boolean isProjectGroupCurrentlyPreparingBuild( int projectGroupId )
        throws Exception;

    public Boolean removeFromPrepareBuildQueue( int projectGroupId, int scmRootId )
        throws Exception;

    public Boolean removeFromPrepareBuildQueue( List<String> hashCodes )
        throws Exception;

    public Boolean removeFromBuildQueue( int projectId, int buildDefinitionId )
        throws Exception;

    public Boolean removeFromBuildQueue( List<String> hashCodes )
        throws Exception;

    /**
     * Get build agent's platform.
     *
     * @return The operating system name of the build agent
     * @throws Exception
     */
    public String getBuildAgentPlatform()
        throws Exception;

    /**
     * Execute a directory purge on the build agent
     *
     * @param directoryType  valid types are <i>working</i> and <i>releases</i>
     * @param daysOlder      days older
     * @param retentionCount retention count
     * @param deleteAll      delete all flag
     * @throws Exception error that will occur during the purge
     */
    public void executeDirectoryPurge( String directoryType, int daysOlder, int retentionCount, boolean deleteAll )
        throws Exception;

    /**
     * Execute a repository purge on the build agent
     *
     * @param repoName                used to determine location at the build agent
     * @param daysOlder               age in days when file is eligible for purging
     * @param retentionCount          number of artifact versions required to retain
     * @param deleteAll               triggers full deletion
     * @param deleteReleasedSnapshots whether to remove all snapshots matching a released artifact version
     * @throws Exception
     */
    public void executeRepositoryPurge( String repoName, int daysOlder, int retentionCount, boolean deleteAll,
                                        boolean deleteReleasedSnapshots )
        throws Exception;
}
