package de.yannicpunktdee.yoshibot.command;

import de.yannicpunktdee.yoshibot.utils.Logger;
import de.yannicpunktdee.yoshibot.utils.Resources;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.Message.Attachment;
import net.dv8tion.jda.api.entities.MessageEmbed;

import java.io.File;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

/**
 * Abstrakte Superklasse für alle Kommandos.
 *
 * @author Yannic Link
 */
public abstract class YoshiCommand {
	
	protected final String[] requiredArguments = {};
	
	/**
	 * Der Kontext mit dem das Kommando aufgerufen wurde.
	 */
	protected YoshiCommandContext context;
	
	
	/**
	 * Erzeugt ein neues Kommando, führt es aber noch nicht aus. Es wird ermittelt, ob die Argumentenkombination valide
	 * ist und das isOk-Flag gesetzt. Im Fehlerfall wird eine Fehleremeldung spezifiziert.
	 *
	 * @param context Der Kontext mit dem das Kommando aufgerufen wurde.
	 */
	public YoshiCommand(YoshiCommandContext context) {
		this.context = context;
	}
	
	/**
	 * Führt das Kommando aus.
	 *
	 * @return True, wenn Ausführung erfolgreich. False, wenn Ausführung fehlgeschlagen. Fehlermeldung wird in
	 * errorMessage spezifiziert.
	 */
	public boolean execute() {
		if (!context.containsArguments(requiredArguments)) {
			sendMessage("Fehlende Argumente");
			return false;
		}
		return true;
	}
	
	protected final void sendMessage(String message) {
		context.getEvent().getTextChannel().sendMessage(message).queue();
	}
	
	protected final void sendMessage(MessageEmbed messageEmbed) {
		context.getEvent().getTextChannel().sendMessage(messageEmbed).queue();
	}

	protected File downloadAttachmentToFile(String directoryPath, String name){
		if(directoryPath == null) directoryPath = Resources.getTempPath();
		if(name == null) name = UUID.randomUUID().toString();

		if(!(new File(directoryPath)).isDirectory()){
			Logger.logError("Das Download-Verzeichnis wurde nicht gefunden.");
			sendMessage("Der Anhang konnte nicht gedownloaded werden.");
			return null;
		}

		List<Attachment> attachments = context.getEvent().getMessage().getAttachments();
		if(attachments.size() == 0){
			return null;
		}
		Attachment attachment = attachments.get(0);

		File file = new File(directoryPath + name + "." + attachment.getFileExtension());
		CompletableFuture<File> future = attachment.downloadToFile(file);
		future.exceptionally(e -> {
			sendMessage("Ein Anhang konnte nicht gedownloaded werden.");
			return null;
		});
		try {
			future.get();
		} catch (InterruptedException | ExecutionException e) {
			sendMessage("Ein Anhang konnte nicht gedownloaded werden.");
			return null;
		}
		if(!file.exists()) {
			sendMessage("Ein Anhang konnte nicht gedownloaded werden.");
			return null;
		}

		return file;
	}

}
