package de.yannicpunktdee.yoshibot.command;

import de.yannicpunktdee.yoshibot.command.commands.*;

/**
 * Unterscheidet nach der spezifizierten Action welche YoshiCommand-Kindklasse zum Ausführen des Kommandos verwendet
 * wird.
 *
 * @author Yannic Link
 */
public class YoshiCommandDistributor {
	
	/**
	 * Führt das jeweils zuständige Kommando aus.
	 *
	 * @param context
	 */
	public static void distribute(YoshiCommandContext context) {
		switch (context.getState()) {
			case NO_ACTION:
				context.getEvent().getTextChannel()
						.sendMessage("Im letzten Befehl wurde keine Aktion spezifiziert. Führe \""
									 + YoshiCommandContext.PREFIX + " help\" für Hilfe aus.").queue();
				return;
			case UNKNOWN_ACTION:
				context.getEvent().getTextChannel()
						.sendMessage("Im letzten Befehl wurde eine unbekannte Aktion angegeben. Führe \""
									 + YoshiCommandContext.PREFIX + " help\" für Hilfe aus.").queue();
				return;
			case BAD_SYNTAX:
				context.getEvent().getTextChannel().sendMessage("Der letzte Befehl hatte ein falsches Format. Führe \""
																+ YoshiCommandContext.PREFIX + " help\" für Hilfe aus.")
						.queue();
				return;
			default:
				break;
		}
		
		YoshiCommand command = null;
		switch (context.getAction()) {
			case HELP:
				command = new HelpCommand(context);
				break;
			case JOKE:
				command = new JokeCommand(context);
				break;
			case SAY:
				command = new SayCommand(context);
				break;
			case PLAY:
				command = new PlayCommand(context);
				break;
			case SAUCE:
				command = new SauceCommand(context);
				break;
			case PAT:
				command = new PatCommand(context);
				break;
            case BONK:
                command = new BonkCommand(context);
                break;
			case WIKIPEDIA:
				command = new WikipediaCommand(context);
				break;
			default:
				context.getEvent().getTextChannel().sendMessage("Dieses Kommando existiert noch nicht.").queue();
				break;
		}
		
		if (command != null) command.execute();
	}
	
	/**
	 * Enth�lt alle m�glichen Aktionen, die der Yoshi-Bot ausf�hren kann.
	 *
	 * @author Yannic Link
	 */
	public enum Action {
		/**
		 * Sende eine Hilfe-Nachricht, in der die Benutzung des Yoshi-Bots dokumentiert ist.
		 */
		HELP,
		/**
		 * Erzählt einen Jokus.
		 */
		JOKE,
		/**
		 * Gib die Nachricht -message aus. �ber die Option -out [text|voice] wird angegeben, ob die Nachricht per
		 * Textnachricht oder als Text-To-Speech ausgegeben wird. Mit -channel l�sst sich der Ausgabechannel bestimmen.
		 * Standardm��ig wird die Ausgabe in den Textchannel zur�ckgesendet, aus dem das Kommando kam.
		 */
		SAY,
		/**
		 * Gibt eine vorhandene Ressource -name aus. (Vorhandene Ressourcen lassen sich mit der Aktion LIST anzeigen).
		 * �ber den Parameter -type [link|audio|video] l�sst sich der Typ der Ressource spezifizieren. Ein Link wird
		 * �ber in den per -channel spezifizierten (default=Ursprungskanal) Textkanal geschickt. Eine Audiodatei wird
		 * �ber den per -channel spezifizierten (default=Aktueller Kanal) Voice-Channel ausgegeben. Ein Video wird �ber
		 * den per -channel spezifizierten (default=Aktueller Kanal) Voice-Channel abgespielt.
		 */
		PLAY,
		/**
		 * L�scht die Ressource, die �ber -name spezifiziert wurde. Mit -type wird der Ressourcentyp festgelegt.
		 */
		SAUCE,
		PAT,
		BONK,
		WIKIPEDIA
	}
	
	
}
