/*
 *                 Sun Public License Notice
 *
 * The contents of this file are subject to the Sun Public License
 * Version 1.0 (the "License"). You may not use this file except in
 * compliance with the License. A copy of the License is available at
 * http://www.sun.com/
 *
 * The Original Code is NetBeans. The Initial Developer of the Original
 * Code is Sun Microsystems, Inc. Portions Copyright 1997-2000 Sun
 * Microsystems, Inc. All Rights Reserved.
 */
package org.netbeans.lib.cvsclient.command.log;

import org.netbeans.lib.cvsclient.IClientEnvironment;
import org.netbeans.lib.cvsclient.IRequestProcessor;
import org.netbeans.lib.cvsclient.connection.AuthenticationException;
import org.netbeans.lib.cvsclient.admin.Entry;
import org.netbeans.lib.cvsclient.command.AbstractCommand;
import org.netbeans.lib.cvsclient.command.CommandException;
import org.netbeans.lib.cvsclient.command.ICvsFiles;
import org.netbeans.lib.cvsclient.command.IOCommandException;
import org.netbeans.lib.cvsclient.event.DualListener;
import org.netbeans.lib.cvsclient.event.ICvsListener;
import org.netbeans.lib.cvsclient.event.ICvsListenerRegistry;
import org.netbeans.lib.cvsclient.event.IEventSender;
import org.netbeans.lib.cvsclient.file.FileObject;
import org.netbeans.lib.cvsclient.file.ICvsFileSystem;
import org.netbeans.lib.cvsclient.progress.IProgressViewer;
import org.netbeans.lib.cvsclient.progress.RangeProgressViewer;
import org.netbeans.lib.cvsclient.progress.receiving.FileInfoAndMessageResponseProgressHandler;
import org.netbeans.lib.cvsclient.progress.sending.FileStateRequestsProgressHandler;
import org.netbeans.lib.cvsclient.progress.sending.IRequestsProgressHandler;
import org.netbeans.lib.cvsclient.request.CommandRequest;
import org.netbeans.lib.cvsclient.request.Requests;
import org.jetbrains.annotations.NonNls;

import java.io.IOException;

/**
 * @author  Thomas Singer
 */
public class LogCommand extends AbstractCommand {

	// Constants ==============================================================

	@NonNls private static final String EXAM_DIR = " server: Logging ";

	// Fields =================================================================

	private boolean defaultBranch;
	private String dateFilter;
	private boolean headerOnly;
	private boolean noTags;
	private String revisionFilter;
	private String stateFilter;
	private String userFilter;
	private boolean headerAndDescOnly;

	// Setup ==================================================================

	public LogCommand() {
	}

	// Implemented ============================================================

	public final boolean execute(IRequestProcessor requestProcessor, IEventSender eventSender, ICvsListenerRegistry listenerRegistry, IClientEnvironment clientEnvironment, IProgressViewer progressViewer) throws CommandException,
                                                                                                                                                                                                                       AuthenticationException {
		final ICvsFiles cvsFiles;
		try {
			cvsFiles = scanFileSystem(clientEnvironment);
		}
		catch (IOException ex) {
			throw new IOCommandException(ex);
		}

		final Requests requests = new Requests(CommandRequest.LOG, clientEnvironment);
		requests.addArgumentRequest(isDefaultBranch(), "-b");
		requests.addArgumentRequest(isHeaderAndDescOnly(), "-t");
		requests.addArgumentRequest(isHeaderOnly(), "-h");
		requests.addArgumentRequest(isNoTags(), "-N");
		requests.addArgumentRequest(getUserFilter(), "-w");
		requests.addArgumentRequest(getRevisionFilter(), "-r");
		requests.addArgumentRequest(getStateFilter(), "-s");
		requests.addArgumentRequest(getDateFilter(), "-d");
		addFileRequests(cvsFiles, requests, clientEnvironment);
		requests.addLocalPathDirectoryRequest();
		addArgumentRequests(requests);

		final IRequestsProgressHandler requestsProgressHandler = new FileStateRequestsProgressHandler(new RangeProgressViewer(progressViewer, 0.0, 0.5), cvsFiles);
		final ICvsListener responseProgressHandler = new FileInfoAndMessageResponseProgressHandler(new RangeProgressViewer(progressViewer, 0.5, 1.0), cvsFiles, EXAM_DIR);

		final ICvsListener parser = createParser(eventSender, clientEnvironment.getCvsFileSystem());
		final ICvsListener listener = new DualListener(parser, responseProgressHandler);
		listener.registerListeners(listenerRegistry);
		try {
			return requestProcessor.processRequests(requests, requestsProgressHandler);
		}
		finally {
			listener.unregisterListeners(listenerRegistry);
		}
	}

	protected ICvsListener createParser(IEventSender eventSender, ICvsFileSystem cvsFileSystem) {
		return new LogMessageParser(eventSender, cvsFileSystem);
	}

	public final String getCvsCommandLine() {
		@NonNls final StringBuffer cvsCommandLine = new StringBuffer("log ");
		cvsCommandLine.append(getCVSArguments());
		appendFileArguments(cvsCommandLine);
		return cvsCommandLine.toString();
	}

	public final void resetCvsCommand() {
		super.resetCvsCommand();
		setRecursive(true);
		setDefaultBranch(false);
		setHeaderOnly(false);
		setHeaderAndDescOnly(false);
		setNoTags(false);
		setDateFilter(null);
		setRevisionFilter(null);
		setStateFilter(null);
		setUserFilter(null);
	}

	/**
	 * Getter for property defaultBranch, equals the command-line CVS switch
	 * "-b".
	 * @return Value of property defaultBranch.
	 */
	private boolean isDefaultBranch() {
		return defaultBranch;
	}

	/**
	 * Setter for property defaultBranch, equals the command-line CVS switch
	 * "-b".
	 * @param defaultBranch New value of property defaultBranch.
	 */
	public final void setDefaultBranch(boolean defaultBranch) {
		this.defaultBranch = defaultBranch;
	}

	/**
	 * Getter for property dateFilter, equals the command-line CVS switch "-d".
	 * @return Value of property dateFilter.
	 */
	private String getDateFilter() {
		return dateFilter;
	}

	/** Setter for property dateFilter, equals the command-line CVS switch "-d".
	 * @param dateFilter New value of property dateFilter.
	 */
	public final void setDateFilter(String dateFilter) {
		this.dateFilter = dateFilter;
	}

	/** Getter for property headerOnly, equals the command-line CVS switch "-h".
	 * @return Value of property headerOnly.
	 */
	private boolean isHeaderOnly() {
		return headerOnly;
	}

	/** Setter for property headerOnly, equals the command-line CVS switch "-h".
	 * @param headerOnly New value of property headerOnly.
	 */
	public final void setHeaderOnly(boolean headerOnly) {
		this.headerOnly = headerOnly;
	}

	/** Getter for property noTags, equals the command-line CVS switch "-N".
	 * @return Value of property noTags.
	 */
	private boolean isNoTags() {
		return noTags;
	}

	/** Setter for property noTags, equals the command-line CVS switch "-N".
	 * @param noTags New value of property noTags.
	 */
	public final void setNoTags(boolean noTags) {
		this.noTags = noTags;
	}

	/** Getter for property revisionFilter, equals the command-line CVS switch "-r".
	 * @return Value of property revisionFilter.
	 */
	private String getRevisionFilter() {
		return revisionFilter;
	}

	/** Setter for property revisionFilter, equals the command-line CVS switch "-r".
	 * @param revisionFilter New value of property revisionFilter.
	 empty string means latest revision of default branch.
	 */
	public final void setRevisionFilter(String revisionFilter) {
		this.revisionFilter = revisionFilter;
	}

	/** Getter for property stateFilter, equals the command-line CVS switch "-s".
	 * @return Value of property stateFilter.
	 */
	private String getStateFilter() {
		return stateFilter;
	}

	/** Setter for property stateFilter, equals the command-line CVS switch "-s".
	 * @param stateFilter New value of property stateFilter.
	 */
	public final void setStateFilter(String stateFilter) {
		this.stateFilter = stateFilter;
	}

	/** Getter for property userFilter, equals the command-line CVS switch "-w".
	 * @return Value of property userFilter,  empty string means the current user.
	 */
	private String getUserFilter() {
		return userFilter;
	}

	/** Setter for property userFilter, equals the command-line CVS switch "-w".
	 * @param userFilter New value of property userFilter.
	 */
	public final void setUserFilter(String userFilter) {
		this.userFilter = userFilter;
	}

	/** Getter for property headerAndDescOnly, equals the command-line CVS switch "-t".
	 * @return Value of property headerAndDescOnly.
	 */
	private boolean isHeaderAndDescOnly() {
		return headerAndDescOnly;
	}

	/** Setter for property headerAndDescOnly, equals the command-line CVS switch "-t".
	 * @param headerAndDescOnly New value of property headerAndDescOnly.
	 */
	public final void setHeaderAndDescOnly(boolean headerAndDescOnly) {
		this.headerAndDescOnly = headerAndDescOnly;
	}

	/**
	 * Returns the arguments of the command in the command-line style.
	 * Similar to getCVSCommand() however without the files and command's name
	 */
	private String getCVSArguments() {
		@NonNls final StringBuilder cvsArguments = new StringBuilder();
		if (isDefaultBranch()) {
			cvsArguments.append("-b ");
		}
		if (isHeaderAndDescOnly()) {
			cvsArguments.append("-t ");
		}
		if (isHeaderOnly()) {
			cvsArguments.append("-h ");
		}
		if (isNoTags()) {
			cvsArguments.append("-N ");
		}
		if (!isRecursive()) {
			cvsArguments.append("-l ");
		}
		if (userFilter != null) {
			cvsArguments.append("-w");
			cvsArguments.append(userFilter);
			cvsArguments.append(' ');
		}
		if (revisionFilter != null) {
			cvsArguments.append("-r");
			cvsArguments.append(revisionFilter);
			cvsArguments.append(' ');
		}
		if (stateFilter != null) {
			cvsArguments.append("-s");
			cvsArguments.append(stateFilter);
			cvsArguments.append(' ');
		}
		if (dateFilter != null) {
			cvsArguments.append("-d");
			cvsArguments.append(dateFilter);
			cvsArguments.append(' ');
		}
		return cvsArguments.toString();
	}

	// Utils ==================================================================

	protected final void addModifiedRequest(FileObject fileObject, Entry entry, Requests requests, IClientEnvironment clientEnvironment) {
		requests.addIsModifiedRequest(fileObject);
	}
}
