package org.apache.maven.scm.provider.accurev;

/*
 * 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.text.DateFormat;
import java.util.Collection;
import java.util.List;
import java.util.Map;

import org.apache.maven.scm.command.blame.BlameLine;
import org.apache.maven.scm.util.ThreadSafeDateFormat;

/**
 * Represents the AccuRev CLI interface
 * 
 * @author ggardner
 */
public interface AccuRev
{

    public static final String DEFAULT_ACCUREV_EXECUTABLE = "accurev";

    public static final int DEFAULT_PORT = 5050;

    public static final String ACCUREV_TIME_FORMAT_STRING = "yyyy/MM/dd HH:mm:ss";

    public static final DateFormat ACCUREV_TIME_SPEC = new ThreadSafeDateFormat( ACCUREV_TIME_FORMAT_STRING );

    public static final String DEFAULT_REMOVE_MESSAGE = "removed (maven-scm)";

    public static final String DEFAULT_ADD_MESSAGE = "initial version (maven-scm)";

    public static final String DEFAULT_PROMOTE_MESSAGE = "promote (maven-scm)";

    /**
     * Reset command process, clear command output accumulators
     */
    void reset();

    /**
     * Populate external to a workspace a (stream) and transactionId/time, to a specific location.
     * 
     * <p>
     * You must check {@link AccuRevCapability#POPULATE_TO_TRANSACTION} before passing a tranid/time
     * to this method. If not supported should pass "now","highest" or null for tranSpec
     * 
     * @param basedir
     * @param stream stream to update to
     * @param tranSpec transaction to update to or "now" if not supported.
     * @param elements (must be depot relative. if null "/./" root is used)
     * @return
     * @throws AccuRevException
     */
    List<File> popExternal( File basedir, String stream, String tranSpec, Collection<File> elements )
        throws AccuRevException;

    /**
     * Re populate missing files to existing workspace.
     * 
     * @param basedir
     * @param elements
     * @return
     * @throws AccuRevException
     */
    List<File> pop( File basedir, Collection<File> elements )
        throws AccuRevException;

    /**
     * Make workspace
     * 
     * @param basisStream
     * @param workspaceName
     * @param basedir
     * @return
     * @throws AccuRevException
     */
    boolean mkws( String basisStream, String workspaceName, File basedir )
        throws AccuRevException;

    /**
     * Update a workspace or reftree, to a particular transaction id
     * 
     * @param basedir
     * @param transactionId
     * @return
     * @throws AccuRevException
     */
    List<File> update( File basedir, String transactionId )
        throws AccuRevException;

    /**
     * Get info about the current logged in user for the current workspace.
     * 
     * @param basedir
     * @return
     */
    AccuRevInfo info( File basedir )
        throws AccuRevException;

    /**
     * Deactivate a workspace
     * 
     * @param workSpaceName full name of the workspace, including the user suffix
     * @return
     */
    boolean rmws( String workSpaceName )
        throws AccuRevException;

    /**
     * Reactivate a workspace
     * 
     * @param workSpaceName full name of the workspace, including the user suffix
     * @return
     */
    boolean reactivate( String workSpaceName )
        throws AccuRevException;

    /**
     * The accurev command line strings since last reset(), separated by ";"
     * 
     * @return
     */
    String getCommandLines();

    /**
     * Full output of accurev command line invocations since reset
     * 
     * @return
     */
    String getErrorOutput();

    /**
     * Add the file to the repository. File must be within a workspace
     * 
     * @param basedir base directory of the workspace
     * @param files to add (relative to basedir, or absolute)
     * @param message the commit message
     */
    List<File> add( File basedir, List<File> files, String message )
        throws AccuRevException;

    /**
     * Remove the file from the repository. Files must be within a workspace
     * 
     * @param basedir
     * @param files
     * @param message
     * @return
     * @throws AccuRevException
     */
    List<File> defunct( File basedir, List<File> files, String message )
        throws AccuRevException;

    /**
     * Any elements that have been kept previously or are currently modified will be promoted.
     * 
     * @param basedir - location of the workspace to act on
     * @param message
     * @return
     * @throws AccuRevException
     */
    List<File> promoteAll( File basedir, String message )
        throws AccuRevException;

    List<File> promote( File basedir, List<File> files, String message )
        throws AccuRevException;

    /**
     * Relocate/reparent a workspace
     * 
     * @param basedir
     * @param workSpaceName (full workspacename including user)
     * @param newBasisStream
     * @return
     * @throws AccuRevException
     */
    boolean chws( File basedir, String workSpaceName, String newBasisStream )
        throws AccuRevException;

    boolean mksnap( String snapShotName, String basisStream )
        throws AccuRevException;

    List<File> statTag( String streamName )
        throws AccuRevException;

    /**
     * Sorts list of elements by whether they exist in the backing stream or not.
     * 
     * @param basedir
     * @param elements
     * @return
     * @throws AccuRevException
     */
    CategorisedElements statBackingStream( File basedir, Collection<File> elements )
        throws AccuRevException;

    /**
     * @param basedir
     * @param elements list of elements to stat, relative to basedir
     * @param statType
     * @return
     * @throws AccuRevException
     */
    List<File> stat( File basedir, Collection<File> elements, AccuRevStat statType )
        throws AccuRevException;

    /**
     * Accurev status of an element
     * 
     * @param element
     * @return null if ignored or not in workspace
     */
    String stat( File element )
        throws AccuRevException;

    List<Transaction> history( String baseStream, String fromTimeSpec, String toTimeSpec, int count,
                               boolean depotHistory, boolean transactionsOnly )
        throws AccuRevException;

    /**
     * AccuRev differences of a stream between to timespecs
     * 
     * @param baseStream
     * @param fromTimeSpec
     * @param toTimeSpec
     * @return
     * @throws AccuRevException
     */
    List<FileDifference> diff( String baseStream, String fromTimeSpec, String toTimeSpec )
        throws AccuRevException;

    /**
     * AccuRev annotate an element
     * 
     * @param file
     * @return
     * @throws AccuRevException
     */
    List<BlameLine> annotate( File baseDir, File file )
        throws AccuRevException;

    /**
     * Logins in as the given user, retains authtoken for use with subsequent commands.
     * 
     * @param user
     * @param password
     * @return
     * @throws AccuRevException
     */
    boolean login( String user, String password )
        throws AccuRevException;

    Map<String, WorkSpace> showWorkSpaces()
        throws AccuRevException;

    Map<String, WorkSpace> showRefTrees()
        throws AccuRevException;

    Stream showStream( String stream )
        throws AccuRevException;

    String getExecutable();

    String getClientVersion()
        throws AccuRevException;

    boolean  syncReplica()
        throws AccuRevException;

}