package com.xxiivv.mute;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
class Statement implements Comparable<Statement>
{
public String name = null;
public Map<Object, Object> values = new HashMap<Object, Object>();
public List<Predicate> conditions = new ArrayList<Predicate>();
public List<Func<String>> operations = new ArrayList<Func<String>>();
public Statement() { }
public Statement(String name) {
this.name = name;
}
public boolean isSingleton() { return values.size() == 1 && values.containsKey(1); }
public Object getSingletonValue() {
for (Object v : values.values())
return v;
return null;
}
public boolean hasValue() { return values.size() > 0; }
public void setValue(Value value) {
if (value.name == null)
value.name = getNextIndex();
values.put(value.name, value.value);
}
public Object getValue(Object name) {
return values.get(name);
}
public ValueCollection getValues() {
Value[] copy = new Value[values.size()];
int i = 0;
for (Object k : values.keySet())
copy[i++] = new Value(k, values.get(k));
return new ValueCollection(copy);
}
public Map<Object, Object> getValueMap() {
return values;
}
private int getNextIndex() {
int nextIndex = 1;
for (Object name : values.keySet())
if (name instanceof Integer)
nextIndex = Math.max(nextIndex, (int) name + 1);
return nextIndex;
}
public boolean testConditions() {
boolean allConditionsPass = true;
for (Predicate p : conditions)
allConditionsPass &= p.evaluate();
return allConditionsPass;
}
public String execute() {
StringBuilder bld = new StringBuilder();
if (testConditions())
for (Func<String> operation : operations)
{
String result = operation.evaluate();
if (result != null)
bld.append(result + "\n");
}
return bld.toString().trim();
}
@Override
public String toString() {
String text = "";
if (hasValue() && !isSingleton())
text = getValues().toString();
return String.format("%s %s", name, isSingleton() ? "[" + getSingletonValue() + "]" : text);
}
@Override
public int compareTo(Statement o) {
return name.compareTo(o.name);
}
}