package me.tom.sparse.spigot.chat.menu;

import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.plugin.Plugin;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.BiFunction;

public class CMListener implements Listener
{
	private static Map<Player, BiFunction<Player, String, Boolean>> chatListeners = new ConcurrentHashMap<>();
	
	public static void cancelExpectation(Player player)
	{
		chatListeners.remove(player);
	}
	
	public static void expectPlayerChat(Player player, BiFunction<Player, String, Boolean> function)
	{
		if(player == null || !player.isOnline())
			throw new IllegalArgumentException("Cannot wait for chat for a null/offline player.");
		if(function == null)
			throw new IllegalArgumentException("Cannot call null function.");
		
		chatListeners.put(player, function);
	}
	
	private CMCommand command;
	
	CMListener(Plugin plugin)
	{
		command = new CMCommand();
		Bukkit.getPluginManager().registerEvents(this, plugin);
	}
	
	@EventHandler
	public void onPlayerChat(AsyncPlayerChatEvent e)
	{
		Player player = e.getPlayer();
		BiFunction<Player, String, Boolean> listener = chatListeners.get(player);
		if(listener != null)
		{
			e.setCancelled(true);
			if(listener.apply(player, e.getMessage()))
				chatListeners.remove(player);
		}
	}
	
	@EventHandler
	public void onPlayerQuit(PlayerQuitEvent e)
	{
		cancelExpectation(e.getPlayer());
	}
	
	@EventHandler(priority = EventPriority.LOWEST)
	public void onCommandPreprocess(PlayerCommandPreprocessEvent e)
	{
		String cmd = e.getMessage().substring(1);
		if(cmd.length() <= 0) return;
		String[] unprocessedArgs = cmd.split(" ");
		
		String label = unprocessedArgs[0];
		String[] args = new String[unprocessedArgs.length - 1];
		System.arraycopy(unprocessedArgs, 1, args, 0, args.length);
		
		if(label.equalsIgnoreCase("cmapi"))
		{
			e.setCancelled(true);
			command.onCommand(e.getPlayer(), null, label, args);
		}
	}
}