package net.onedaybeard.dominatrix.experimental.artemis;
import net.onedaybeard.dominatrix.annotation.Sloppy;
import net.onedaybeard.dominatrix.artemis.ComponentNameComparator;
import net.onedaybeard.dominatrix.util.Tree;
import com.artemis.Component;
import com.artemis.Entity;
import com.artemis.EntitySystem;
import com.artemis.World;
import com.artemis.managers.TagManager;
import com.artemis.utils.Bag;
import com.artemis.utils.ImmutableBag;
@Sloppy("ought to be refnuqued")
public final class CommandUtils
{
public static Tree<ObjectNode> feedComponents(Tree<ObjectNode> systemTree, Entity e)
{
if (systemTree == null)
systemTree = new Tree<ObjectNode>();
Tree<ObjectNode> entityNode = systemTree.addNode(new EntityNode(e));
Bag<Component> components = e.getComponents(new Bag<Component>());
components.sort(new ComponentNameComparator());
for (int i = 0, s = components.size(); s > i; i++)
{
Component component = components.get(i);
entityNode.addNode(ComponentNode.from(component));
}
return systemTree;
}
public static StringBuilder formatTree(Tree<ObjectNode> tree, StringBuilder buffer)
{
if (buffer == null)
buffer = new StringBuilder();
ObjectNode node = tree.getValue();
if (node != null)
{
buffer.append(treeFormatNode(tree));
buffer.append(node.format());
}
for (Tree<ObjectNode> childNode : tree.getChildNodes())
{
formatTree(childNode, buffer);
}
return buffer;
}
private static String treeFormatNode(Tree<ObjectNode> tree)
{
StringBuilder sb = new StringBuilder();
Tree<ObjectNode> treeCopy = tree;
if (!treeCopy.getParent().isRootNode())
{
sb.append(treeCopy.isLastNode() ? "\\-- " : "|-- ");
}
else
{
sb.append( "=-- " );
}
while ((treeCopy = treeCopy.getParent()) != null)
{
if (treeCopy.isRootNode()) // there's no root to visualize
break;
if (treeCopy.isLastNode() || treeCopy.getParent().isRootNode())
sb.insert(0, " ");
else
sb.insert(0, "| ");
}
return sb.toString();
}
static Tree<ObjectNode> getSystems(ImmutableBag<EntitySystem> systems)
{
Tree<ObjectNode> systemTree = new Tree<ObjectNode>();
Tree<ObjectNode> automatic = systemTree.addNode(new LabelNode("automatic"));
Tree<ObjectNode> passive = systemTree.addNode(new LabelNode("passive"));
for (int i = 0, s = systems.size(); s > i; i++)
{
EntitySystem system = systems.get(i);
if (system.isPassive())
passive.addNode(SystemNode.from(system));
else
automatic.addNode(SystemNode.from(system));
}
return systemTree;
}
static Entity getEntity(World world, String entity)
{
if (entity.matches("^\\d*$"))
return world.getEntity(Integer.parseInt(entity));
else
return world.getManager(TagManager.class).getEntity(entity);
}
public static interface ObjectNode
{
String format();
}
private static class LabelNode implements ObjectNode
{
private String label;
public LabelNode(String label)
{
this.label = label + "\n";
}
@Override
public String format()
{
return label;
}
}
static class SystemNode implements ObjectNode
{
private EntitySystem system;
private static int longestName;
public SystemNode(EntitySystem system)
{
int nameLength = system.getClass().getSimpleName().length();
if (longestName < nameLength)
longestName = nameLength;
this.system = system;
}
public static SystemNode from(EntitySystem system)
{
return new SystemNode(system);
}
@Override
public String format()
{
String format = system.isEnabled()
? "%-" + longestName + "s entities: %d\n"
: "(%-" + longestName + "s entities: %d)\n";
return String.format(format,
system.getClass().getSimpleName(),
system.getActives().size());
}
}
static class EntityNode implements ObjectNode
{
private Entity entity;
public EntityNode(Entity e)
{
this.entity = e;
}
@Override
public String format()
{
return String.format("Entity[%d] (%s)\n", entity.getId(), entity.getUuid().toString());
}
}
private static class ComponentNode implements ObjectNode
{
private static int longestName;
private Component component;
private ComponentNode(Component component)
{
int nameLength = component.getClass().getSimpleName().length();
if (longestName < nameLength)
longestName = nameLength;
this.component = component;
}
public static ComponentNode from(Component component)
{
return new ComponentNode(component);
}
@Override
public String format()
{
return String.format("%s\n", component);
}
}
}