/FileExtraction/Java_unseen/Wind-Development_WindSpigot/WindSpigot-API/src/main/java/org/bukkit/conversations/ValidatingPrompt.java
package org.bukkit.conversations;

import org.bukkit.ChatColor;

/**
 * ValidatingPrompt is the base class for any prompt that requires validation.
 * ValidatingPrompt will keep replaying the prompt text until the user enters a
 * valid response.
 */
public abstract class ValidatingPrompt implements Prompt {
	public ValidatingPrompt() {
		super();
	}

	/**
	 * Accepts and processes input from the user and validates it. If validation
	 * fails, this prompt is returned for re-execution, otherwise the next Prompt in
	 * the prompt graph is returned.
	 *
	 * @param context Context information about the conversation.
	 * @param input   The input text from the user.
	 * @return This prompt or the next Prompt in the prompt graph.
	 */
	public Prompt acceptInput(ConversationContext context, String input) {
		if (isInputValid(context, input)) {
			return acceptValidatedInput(context, input);
		} else {
			String failPrompt = getFailedValidationText(context, input);
			if (failPrompt != null) {
				context.getForWhom().sendRawMessage(ChatColor.RED + failPrompt);
			}
			// Redisplay this prompt to the user to re-collect input
			return this;
		}
	}

	/**
	 * Ensures that the prompt waits for the user to provide input.
	 *
	 * @param context Context information about the conversation.
	 * @return True.
	 */
	public boolean blocksForInput(ConversationContext context) {
		return true;
	}

	/**
	 * Override this method to check the validity of the player's input.
	 *
	 * @param context Context information about the conversation.
	 * @param input   The player's raw console input.
	 * @return True or false depending on the validity of the input.
	 */
	protected abstract boolean isInputValid(ConversationContext context, String input);

	/**
	 * Override this method to accept and processes the validated input from the
	 * user. Using the input, the next Prompt in the prompt graph should be
	 * returned.
	 *
	 * @param context Context information about the conversation.
	 * @param input   The validated input text from the user.
	 * @return The next Prompt in the prompt graph.
	 */
	protected abstract Prompt acceptValidatedInput(ConversationContext context, String input);

	/**
	 * Optionally override this method to display an additional message if the user
	 * enters an invalid input.
	 *
	 * @param context      Context information about the conversation.
	 * @param invalidInput The invalid input provided by the user.
	 * @return A message explaining how to correct the input.
	 */
	protected String getFailedValidationText(ConversationContext context, String invalidInput) {
		return null;
	}
}
