package net.shortninja.staffplus.server.listener.player;

import java.util.UUID;

import net.shortninja.staffplus.StaffPlus;
import net.shortninja.staffplus.player.attribute.mode.ModeCoordinator;
import net.shortninja.staffplus.player.attribute.mode.handler.FreezeHandler;
import net.shortninja.staffplus.server.command.BaseCmd;
import net.shortninja.staffplus.server.command.CmdHandler;
import net.shortninja.staffplus.server.data.config.Messages;
import net.shortninja.staffplus.server.data.config.Options;
import net.shortninja.staffplus.util.MessageCoordinator;
import net.shortninja.staffplus.util.PermissionHandler;

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.PlayerCommandPreprocessEvent;

public class PlayerCommandPreprocess implements Listener
{
	private PermissionHandler permission = StaffPlus.get().permission;
	private MessageCoordinator message = StaffPlus.get().message;
	private Options options = StaffPlus.get().options;
	private Messages messages = StaffPlus.get().messages;
	private FreezeHandler freezeHandler = StaffPlus.get().freezeHandler;
	private CmdHandler cmdHandler = StaffPlus.get().cmdHandler;
	private ModeCoordinator modeCoordinator = StaffPlus.get().modeCoordinator;
	
	public PlayerCommandPreprocess()
	{
		Bukkit.getPluginManager().registerEvents(this, StaffPlus.get());
	}
	
	@EventHandler(priority = EventPriority.HIGHEST)
	public void onCommand(PlayerCommandPreprocessEvent event)
	{
		Player player = event.getPlayer();
		UUID uuid = player.getUniqueId();
		String command = event.getMessage().toLowerCase();
		
		if(command.startsWith("/help staffplus") || command.startsWith("/help staff+"))
		{
			sendHelp(player);
			event.setCancelled(true);
			return;
		}
		
		if(options.blockedCommands.contains(command) && permission.hasOnly(player, options.permissionBlock))
		{
			message.send(player, messages.commandBlocked, messages.prefixGeneral);
			event.setCancelled(true);
		}else if(modeCoordinator.isInMode(uuid) && options.blockedModeCommands.contains(command))
		{
			message.send(player, messages.modeCommandBlocked, messages.prefixGeneral);
			event.setCancelled(true);
		}else if(freezeHandler.isFrozen(uuid) && (!options.modeFreezeChat || (freezeHandler.isLoggedOut(uuid)) && !command.startsWith("/" + options.commandLogin)))
		{
			message.send(player, messages.chatPrevented, messages.prefixGeneral);
			event.setCancelled(true);
		}
	}
	
	private void sendHelp(Player player)
	{
		int count = 0;
		
		message.send(player, "&7" + message.LONG_LINE, "");
		
		for(BaseCmd baseCmd : cmdHandler.BASES)
		{
			if(baseCmd.getPermissions().isEmpty())
			{
				message.send(player, "&b/" + baseCmd.getMatch() + " &8� " + baseCmd.getDescription().toLowerCase(), "");
				count++;
			}else
			{
				for(String permission : baseCmd.getPermissions())
				{
					if(this.permission.has(player, permission))
					{
						message.send(player, "&b/" + baseCmd.getMatch() + " &8� " + baseCmd.getDescription().toLowerCase(), "");
						count++;
						break;
					}
				}
			}
		}
		
		if(count == 0)
		{
			message.send(player, messages.noPermission, messages.prefixGeneral);
		}
		
		message.send(player, "&7" + message.LONG_LINE, "");
	}
}