package edu.brown.cs.h2r.burlapcraft.command;

import burlap.behavior.singleagent.auxiliary.StateReachability;
import burlap.mdp.core.oo.state.OOState;
import burlap.mdp.core.state.State;
import burlap.mdp.singleagent.SADomain;
import burlap.statehashing.simple.SimpleHashableStateFactory;
import edu.brown.cs.h2r.burlapcraft.BurlapCraft;
import edu.brown.cs.h2r.burlapcraft.domaingenerator.MinecraftDomainGenerator;
import edu.brown.cs.h2r.burlapcraft.state.BCAgent;
import edu.brown.cs.h2r.burlapcraft.state.MinecraftStateGeneratorHelper;
import net.minecraft.command.ICommand;
import net.minecraft.command.ICommandSender;

import java.util.Arrays;
import java.util.List;

import static edu.brown.cs.h2r.burlapcraft.helper.HelperNameSpace.CLASS_AGENT;

/**
 * @author James MacGlashan.
 */
public class CommandReachable implements ICommand{


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

	@Override
	public String getCommandUsage(ICommandSender p_71518_1_) {
		return "";
	}

	@Override
	public List getCommandAliases() {
		return Arrays.asList("reachable");
	}

	@Override
	public void processCommand(ICommandSender p_71515_1_, String[] p_71515_2_) {

		MinecraftDomainGenerator mdg = new MinecraftDomainGenerator();
		SADomain domain = mdg.generateDomain();

		State in = MinecraftStateGeneratorHelper.getCurrentState(BurlapCraft.currentDungeon);
		List<State> reachable = StateReachability.getReachableStates(in, domain, new SimpleHashableStateFactory());
		for(State s : reachable){
			OOState os = (OOState)s;
			BCAgent a = (BCAgent)os.object(CLASS_AGENT);
			System.out.println(a.x + ", " + a.y + ", " + a.z + ", " + a.rdir + ", "+ a.vdir + ", " + a.selected);
		}
		System.out.println(reachable.size());

	}

	@Override
	public boolean canCommandSenderUseCommand(ICommandSender p_71519_1_) {
		return true;
	}

	@Override
	public List addTabCompletionOptions(ICommandSender p_71516_1_, String[] p_71516_2_) {
		return null;
	}

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

	@Override
	public int compareTo(Object o) {
		return 0;
	}
}