package codechicken.core.commands;

import java.util.List;

import codechicken.core.ServerUtils;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.*;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.command.ICommand;
import net.minecraft.command.ICommandSender;
import net.minecraft.world.WorldServer;
import net.minecraftforge.common.DimensionManager;

public abstract class CoreCommand implements ICommand
{
    public static void chatT(ICommandSender sender, String s, Object... params) {
        sender.addChatMessage(new ChatComponentTranslation(s, params));
    }

    public static void chatOpsT(String s, Object... params) {
        for (EntityPlayerMP player : ServerUtils.getPlayers())
            if (MinecraftServer.getServer().getConfigurationManager().canSendCommands(player.getGameProfile()))
                player.addChatMessage(new ChatComponentTranslation(s, params));
    }

    public abstract boolean OPOnly();

    @Override
    public String getCommandUsage(ICommandSender var1) {
        return "/" + getCommandName() + " help";
    }

    @Override
    public void processCommand(ICommandSender sender, String[] args) {
        if (args.length < minimumParameters() ||
                args.length == 1 && args[0].equals("help")) {
            printHelp(sender);
            return;
        }

        String command = getCommandName();
        for (String arg : args)
            command += " " + arg;

        handleCommand(command, sender.getCommandSenderName(), args, sender);
    }

    public abstract void handleCommand(String command, String playername, String[] args, ICommandSender listener);

    public abstract void printHelp(ICommandSender sender);

    public final EntityPlayerMP getPlayer(String name) {
        return ServerUtils.getPlayer(name);
    }

    public WorldServer getWorld(int dimension) {
        return DimensionManager.getWorld(dimension);
    }

    public WorldServer getWorld(EntityPlayer player) {
        return (WorldServer) player.worldObj;
    }

    @Override
    public int compareTo(Object o) {
        return getCommandName().compareTo(((ICommand) o).getCommandName());
    }

    @Override
    public List<?> getCommandAliases() {
        return null;
    }

    @Override
    public List<?> addTabCompletionOptions(ICommandSender sender, String[] args, BlockPos pos) {
        return null;
    }

    @Override
    public boolean isUsernameIndex(String[] args, int index) {
        return false;
    }

    @Override
    public boolean canCommandSenderUseCommand(ICommandSender var1) {
        if (OPOnly()) {
            if (var1 instanceof EntityPlayer)
                return MinecraftServer.getServer().getConfigurationManager().canSendCommands(((EntityPlayer) var1).getGameProfile());

            return var1 instanceof MinecraftServer;
        }
        return true;
    }

    public abstract int minimumParameters();
}