package jas.spawner.modern.command.mods;

import jas.spawner.modern.MVELProfile;
import jas.spawner.modern.command.CommandJasBase;
import jas.spawner.modern.modification.ModAddBiomeGroup;
import jas.spawner.modern.modification.ModRemoveBiomeGroup;
import jas.spawner.modern.modification.ModUpdateBiomeGroup;
import jas.spawner.modern.spawner.biome.group.BiomeGroupRegistry;

import java.util.ArrayList;
import java.util.List;

import net.minecraft.command.ICommandSender;
import net.minecraft.command.WrongUsageException;

public class CommandModBiomeGroup extends CommandJasBase {

	public String getCommandName() {
		return "modbiomegroup";
	}

	private enum Ops {
		//TODO Add RESET command to reset to default
		ADD("add", "a", "+"), REMOVE("remove", "rem", "r", "-"), UPDATE("update", "upd", "u", "->"), NONE("");
		public final String[] matchingWords; // Phrases that represent this
												// operation

		Ops(String... matchingWords) {
			this.matchingWords = matchingWords;
		}

		public static Ops determineOp(String potentialWord) {
			for (Ops op : Ops.values()) {
				for (String word : op.matchingWords) {
					if (word.equalsIgnoreCase(potentialWord)) {
						return op;
					}
				}
			}
			return NONE;
		}
	}

	/**
	 * Return the required permission level for this command.
	 */
	public int getRequiredPermissionLevel() {
		return 2;
	}

	@Override
	public String getCommandUsage(ICommandSender commandSender) {
		return "commands.modbiomegroup.usage";
	}

	@Override
	public void process(ICommandSender commandSender, String[] stringArgs) {
		if (stringArgs.length <= 1) {
			throw new WrongUsageException("commands.modbiomegroup.usage", new Object[0]);
		}

		// Format /jas addbgroup <add/remove/update> <biomeGroupID>
		// <mapping/A|attribute/B|group#1>,
		Ops operation = Ops.determineOp(stringArgs[0]);
		String biomeGroupID = stringArgs[1];
		ArrayList<String> groupContents = new ArrayList<String>();
		for (int i = 2; i < stringArgs.length; i++) {
			if (stringArgs[i] == null || stringArgs[i].trim().isEmpty()) {
				continue;
			}
			groupContents.add(stringArgs[i]);
		}
		if (biomeGroupID != null && !biomeGroupID.isEmpty()) {
			switch (operation) {
			case ADD:
				MVELProfile.worldSettings().addChange(new ModAddBiomeGroup(biomeGroupID, groupContents));
				break;
			case REMOVE:
				MVELProfile.worldSettings().addChange(new ModRemoveBiomeGroup(biomeGroupID));
				break;
			case UPDATE:
				MVELProfile.worldSettings().addChange(new ModUpdateBiomeGroup(biomeGroupID, groupContents));
				break;
			case NONE:
				throw new WrongUsageException("commands.modbiomegroup.biomegroupoperatorundefined", new Object[0]);
			}
		} else {
			throw new WrongUsageException("commands.modbiomegroup.biomegroupundefined", new Object[0]);
		}
	}

	/**
	 * Adds the strings available in this command to the given list of tab
	 * completion options.
	 */
	@Override
	public List<String> getTabCompletions(ICommandSender commandSender, String[] stringArgs) {
		stringArgs = correctedParseArgs(stringArgs, false);
		List<String> tabCompletions = new ArrayList<String>();
		if (stringArgs.length == 1) {
			for (Ops operation : Ops.values()) {
				for (String matchingWord : operation.matchingWords) {
					tabCompletions.add(matchingWord);
				}
			}
			return tabCompletions;
		} else if (stringArgs.length == 2) {
			BiomeGroupRegistry registry = MVELProfile.worldSettings().biomeGroupRegistry();
			for (String iD : registry.iDToGroup().keySet()) {
				if (iD.contains(" ")) {
					tabCompletions.add("\"".concat(iD).concat("\""));
				} else {
					tabCompletions.add(iD);
				}
			}
			return tabCompletions; // BiomeGroupID can be anything when adding
		} else {
			BiomeGroupRegistry registry = MVELProfile.worldSettings().biomeGroupRegistry();
			for (String mapping : registry.biomeMappingToPckg().keySet()) {
				if (mapping.contains(" ")) {
					tabCompletions.add("\"".concat(mapping).concat("\""));
				} else {
					tabCompletions.add(mapping);
				}
			}
			for (String iD : registry.iDToAttribute().keySet()) {
				if (iD.contains(" ")) {
					tabCompletions.add("\"".concat("A|").concat(iD).concat("\""));
				} else {
					tabCompletions.add(("A|").concat(iD));
				}
			}
			for (String iD : registry.iDToGroup().keySet()) {
				if (iD.contains(" ")) {
					tabCompletions.add("\"".concat("B|").concat(iD).concat("\""));
				} else {
					tabCompletions.add(("B|").concat(iD));
				}
			}
			return tabCompletions;
		}
	}
}
