package de.yannicpunktdee.yoshibot.command.commands;

import de.yannicpunktdee.yoshibot.command.YoshiCommand;
import de.yannicpunktdee.yoshibot.command.YoshiCommandContext;
import de.yannicpunktdee.yoshibot.main.YoshiBot;
import net.dv8tion.jda.api.entities.TextChannel;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.List;
import java.util.Random;

import static de.yannicpunktdee.yoshibot.utils.RestHelper.getFromURL;

/**
 * Schickt einen zufälligen Jokus aus einer zufällig ausgewählten Quelle in den Textchannel.
 *
 * @author Yannic Link
 */
public class JokeCommand extends YoshiCommand {
	
	/**
	 * Erstellt einen neuen JokeCommand.
	 */
	public JokeCommand(YoshiCommandContext context) {
		super(context);
	}
	
	/**
	 * {@inheritDoc}
	 */
	@Override
	public synchronized boolean execute() {
		String message = "Jokus";
		
		Random random = YoshiBot.getInstance().getRandom();
		int number = random.nextInt(3);
		switch (number) {
			case 0:
				message = jokeApi();
				break;
			case 1:
				message = officialJokeApi();
				break;
			case 2:
				message = chuckNorris();
				break;
			default:
				message = "Jokus";
				break;
		}
		
		if (context.containsArguments(new String[]{"channel"})) {
			String arg = context.getArgument("channel");
			if (arg == null) {
				sendErrorMessage("Es wurde kein channel angegeben.");
				return false;
			}
			List<TextChannel> channels = YoshiBot.getInstance().jda
					.getTextChannelsByName(context.getArgument("channel"), true);
			if (channels.isEmpty()) {
				sendErrorMessage("Der Kanalname konnte nicht gefunden werden.");
				return false;
			}
			channels.get(0).sendMessage(message).queue();
		} else {
			sendMessage(message);
		}
		return true;
	}
	
	private String chuckNorris() {
		String url = "http://api.icndb.com/jokes/random";
		
		JSONObject json = null;
		
		try {
			String raw = getFromURL(url);
			json = new JSONObject(raw);
			return json.getJSONObject("value").getString("joke");
		} catch (JSONException e) {
			return "Konnte keinen Jokus von \"" + url + "\" laden.";
		}
	}
	
	private String officialJokeApi() {
		String url = "https://official-joke-api.appspot.com/jokes/random";
		
		JSONObject json = null;
		
		try {
			String raw = getFromURL(url);
			json = new JSONObject(raw);
			String result = json.getString("setup");
			result += " - ";
			result += json.getString("punchline");
			return result;
		} catch (JSONException e) {
			return "Konnte keinen Jokus von \"" + url + "\" laden.";
		}
	}
	
	private String jokeApi() {
		String url = "https://v2.jokeapi.dev/joke/any";
		
		JSONObject json = null;
		
		try {
			String raw = getFromURL(url);
			json = new JSONObject(raw);
			String result = json.getString("setup");
			result += " - ";
			result += json.getString("delivery");
			return result;
		} catch (JSONException e) {
			return "Konnte keinen Jokus von \"" + url + "\" laden.";
		}
	}
	
}
