package com.wildex999.tickdynamic.commands;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import com.wildex999.tickdynamic.TickDynamicMod;

import net.minecraft.command.ICommand;
import net.minecraft.command.ICommandSender;
import net.minecraft.util.ChatComponentText;
import net.minecraft.util.ChatStyle;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.IChatComponent;

public class CommandHandler implements ICommand {

	private List<String> aliases;
	private Map<String, ICommand> subCommandHandlers;
	private String listSubCommands;
	private TickDynamicMod mod;
	
	public enum SubCommands {
		tps,
		listworlds,
		world,
		identify,
		reload,
		reloadgroups,
		enabled,
		help
	}
	
	public CommandHandler(TickDynamicMod mod) {
		this.mod = mod;
		
		aliases = new ArrayList<String>();
		aliases.add("tickdynamic");
		aliases.add("td");
		
		subCommandHandlers = new HashMap<String, ICommand>();
		subCommandHandlers.put("reload", new CommandReload(mod));
		subCommandHandlers.put("reloadgroups", new CommandReloadGroups(mod));
		subCommandHandlers.put("listworlds", new CommandListWorlds(mod));
		subCommandHandlers.put("world", new CommandWorld(mod));
		subCommandHandlers.put("enabled", new CommandEnabled(mod));
		
		StringBuilder builderSubCommands = new StringBuilder();
		SubCommands[] subs = SubCommands.values();
		for(SubCommands command : subs) {
			builderSubCommands.append(command).append(", ");
		}
		builderSubCommands.delete(builderSubCommands.length()-2, builderSubCommands.length());
		listSubCommands = builderSubCommands.toString();
	}

	@Override
	public String getCommandName() {
		return "tickdynamic";
	}

	@Override
	public String getCommandUsage(ICommandSender sender) {
		return "tickdynamic [" + listSubCommands + "]";
	}

	@Override
	public List getCommandAliases() {
		return aliases;
	}

	@Override
	public void processCommand(ICommandSender sender, String[] args) {
		if(args.length == 0)
		{
			sender.addChatMessage(new ChatComponentText("Usage: " + getCommandUsage(sender)));
			return;
		}
		
		if(args[0].equals("tps"))
		{
			
			sender.addChatMessage(new ChatComponentText("Average TPS: " + getTPSFormatted(mod) + " TPS"));
			return;
		} else if(args[0].equals("identify")) {
			sender.addChatMessage(new ChatComponentText("Command not yet implemented! This will allow you to check what group a Tile or Entity belongs to by right clicking it.(And other info, like TPS)"));
			return;
		} else if(args[0].equals("help")) {
			sender.addChatMessage(new ChatComponentText("You can find the documentation over at http://mods.stjerncraft.com/tickdynamic"));
			return;
		}
		
		//Send it over to subCommand handler
		ICommand subHandler = subCommandHandlers.get(args[0]);
		if(subHandler == null)
		{
			sender.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "No handler for the command " + EnumChatFormatting.ITALIC + args[0]));
			return;
		}
		subHandler.processCommand(sender, args);
	}


	@Override
	public boolean canCommandSenderUseCommand(ICommandSender sender) {
		return sender.canCommandSenderUseCommand(1, getCommandName());
	}

	@Override
	public List addTabCompletionOptions(ICommandSender sender, String[] args) {
		if(args.length == 1)
		{
			List listOut = new LinkedList();
			String lastArg = args[args.length-1];
			SubCommands[] subCommands = SubCommands.values();
			for(SubCommands command : subCommands)
			{
				if(command.toString().contains(lastArg))
					listOut.add(command.toString());
			}
			
			return listOut;
		}
		else
		{
			//Send it over to subCommand handler
			ICommand subHandler = subCommandHandlers.get(args[0]);
			if(subHandler == null)
				return null;
			return subHandler.addTabCompletionOptions(sender, args);
		}
	}

	@Override
	public boolean isUsernameIndex(String[] args, int index) {
		//TODO: Pass on to subCommand
		return false;
	}
	
	@Override
	public int compareTo(Object arg0) {
		return 0;
	}
	
	public static String getTPSFormatted(TickDynamicMod mod) {
		String tpsOut;
		String color;
		
		if(mod.averageTPS >= 19)
			color = EnumChatFormatting.GREEN.toString();
		else if(mod.averageTPS > 10)
			color = EnumChatFormatting.YELLOW.toString();
		else
			color = EnumChatFormatting.RED.toString();
		
		DecimalFormat tpsFormat = new DecimalFormat("#.00");
		tpsOut = color + tpsFormat.format(mod.averageTPS) + EnumChatFormatting.RESET;
		return tpsOut;
	}

}