/FileExtraction/Java_unseen/Wind-Development_WindSpigot/WindSpigot-Server/src/main/java/org/bukkit/craftbukkit/conversations/ConversationTracker.java
package org.bukkit.craftbukkit.conversations;

import java.util.LinkedList;
import java.util.logging.Level;

import org.bukkit.Bukkit;
import org.bukkit.conversations.Conversation;
import org.bukkit.conversations.ConversationAbandonedEvent;
import org.bukkit.conversations.ManuallyAbandonedConversationCanceller;

/**
 */
public class ConversationTracker {

	private LinkedList<Conversation> conversationQueue = new LinkedList<Conversation>();

	public synchronized boolean beginConversation(Conversation conversation) {
		if (!conversationQueue.contains(conversation)) {
			conversationQueue.addLast(conversation);
			if (conversationQueue.getFirst() == conversation) {
				conversation.begin();
				conversation.outputNextPrompt();
				return true;
			}
		}
		return true;
	}

	public synchronized void abandonConversation(Conversation conversation, ConversationAbandonedEvent details) {
		if (!conversationQueue.isEmpty()) {
			if (conversationQueue.getFirst() == conversation) {
				conversation.abandon(details);
			}
			if (conversationQueue.contains(conversation)) {
				conversationQueue.remove(conversation);
			}
			if (!conversationQueue.isEmpty()) {
				conversationQueue.getFirst().outputNextPrompt();
			}
		}
	}

	public synchronized void abandonAllConversations() {

		LinkedList<Conversation> oldQueue = conversationQueue;
		conversationQueue = new LinkedList<Conversation>();
		for (Conversation conversation : oldQueue) {
			try {
				conversation.abandon(
						new ConversationAbandonedEvent(conversation, new ManuallyAbandonedConversationCanceller()));
			} catch (Throwable t) {
				Bukkit.getLogger().log(Level.SEVERE, "Unexpected exception while abandoning a conversation", t);
			}
		}
	}

	public synchronized void acceptConversationInput(String input) {
		if (isConversing()) {
			conversationQueue.getFirst().acceptInput(input);
		}
	}

	public synchronized boolean isConversing() {
		return !conversationQueue.isEmpty();
	}

	public synchronized boolean isConversingModaly() {
		return isConversing() && conversationQueue.getFirst().isModal();
	}
}
