/*******************************************************************************
 * Copyright (c) 2000, 2013 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.ant.tests.core.testplugin;

import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;

public class AntTestChecker {

	private static AntTestChecker deflt = null;

	private int taskStartedCount;

	private int taskFinishedCount;

	private int targetsStartedCount;

	private int targetsFinishedCount;

	private int buildsStartedCount;

	private int buildsFinishedCount;

	private List<String> messages = new ArrayList<String>();

	private List<String> targets = new ArrayList<String>();

	private List<String> tasks = new ArrayList<String>();

	private List<String> projects = new ArrayList<String>();

	private Hashtable<String, Object> userProperties;

	private List<String> nameOfListeners = new ArrayList<String>();

	private AntTestChecker() {
	}

	/**
	 * Returns the singleton AntTestChecker.
	 */
	public static AntTestChecker getDefault() {
		if (deflt == null) {
			deflt = new AntTestChecker();
		}
		return deflt;
	}

	/**
	 * Resets the singleton AntTestChecker
	 */
	public static void reset() {
		if (deflt != null) {
			deflt.resetState();
		}
	}

	/**
	 * @see org.apache.tools.ant.BuildListener#buildFinished(org.apache.tools.ant.BuildEvent)
	 */
	public void buildFinished() {
		buildsFinishedCount++;
	}

	public void buildStarted(String projectName) {
		buildsStartedCount++;
		projects.add(projectName);
	}

	public void messageLogged(String message) {
		messages.add(message);
	}

	/**
	 * @see org.apache.tools.ant.BuildListener#targetFinished(org.apache.tools.ant.BuildEvent)
	 */
	public void targetFinished() {
		targetsFinishedCount++;
	}

	/**
	 * @see org.apache.tools.ant.BuildListener#targetStarted(org.apache.tools.ant.BuildEvent)
	 */
	public void targetStarted(String targetName) {
		targetsStartedCount++;
		targets.add(targetName);
	}

	/**
	 * @see org.apache.tools.ant.BuildListener#taskFinished(org.apache.tools.ant.BuildEvent)
	 */
	public void taskFinished() {
		taskFinishedCount++;
	}

	/**
	 * @see org.apache.tools.ant.BuildListener#taskStarted(org.apache.tools.ant.BuildEvent)
	 */
	public void taskStarted(String taskName) {
		taskStartedCount++;
		tasks.add(taskName);
	}

	/**
	 * Returns the buildsFinishedCount.
	 * 
	 * @return int
	 */
	public int getBuildsFinishedCount() {
		return buildsFinishedCount;
	}

	/**
	 * Returns the buildsStartedCount.
	 * 
	 * @return int
	 */
	public int getBuildsStartedCount() {
		return buildsStartedCount;
	}

	/**
	 * Returns the messagesLoggedCount.
	 * 
	 * @return int
	 */
	public int getMessagesLoggedCount() {
		return messages.size();
	}

	/**
	 * Returns the targetsFinishedCount.
	 * 
	 * @return int
	 */
	public int getTargetsFinishedCount() {
		return targetsFinishedCount;
	}

	/**
	 * Returns the targetsStartedCount.
	 * 
	 * @return int
	 */
	public int getTargetsStartedCount() {
		return targetsStartedCount;
	}

	/**
	 * Returns the taskFinishedCount.
	 * 
	 * @return int
	 */
	public int getTaskFinishedCount() {
		return taskFinishedCount;
	}

	/**
	 * Returns the taskStartedCount.
	 * 
	 * @return int
	 */
	public int getTaskStartedCount() {
		return taskStartedCount;
	}

	protected void resetState() {
		taskStartedCount = 0;
		taskFinishedCount = 0;
		targetsStartedCount = 0;
		targetsFinishedCount = 0;
		buildsStartedCount = 0;
		buildsFinishedCount = 0;
		messages = new ArrayList<String>();
		tasks = new ArrayList<String>();
		targets = new ArrayList<String>();
		projects = new ArrayList<String>();
		userProperties = null;
		nameOfListeners = new ArrayList<String>();
	}

	/**
	 * Return the message n from the last: e.g. getLoggedMessage(0) returns the most recent message
	 * 
	 * @param n
	 *            message index
	 * @return the nth last message
	 */
	public String getLoggedMessage(int n) {
		int idx = messages.size() - (n + 1);
		if ((idx < 0) || (idx >= messages.size())) {
			return null;
		}
		return messages.get(idx);
	}

	public String getLastMessageLogged() {
		return getLoggedMessage(0);
	}

	public void setUserProperties(Hashtable<String, Object> userProperties) {
		this.userProperties = userProperties;
	}

	public String getUserProperty(String name) {
		return (String) userProperties.get(name);
	}

	public List<String> getMessages() {
		return messages;
	}

	public List<String> getListeners() {
		return nameOfListeners;
	}

	public String getLastListener() {
		return nameOfListeners.get(nameOfListeners.size() - 1);
	}

	public void addNameOfListener(String nameOfListener) {
		this.nameOfListeners.add(nameOfListener);
	}
}
