package it.paspiz85.nanobot.logic;
import it.paspiz85.nanobot.exception.BotException;
import it.paspiz85.nanobot.game.TroopsInfo;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* Execution context of bot.
*
* @author paspiz85
*
*/
public final class Context {
private final Map<String, Object> attributes = new HashMap<>();
private State<?> current;
private boolean disconnected;
private final Logger logger = Logger.getLogger(getClass().getName());
private boolean waitDone;
public Object get(final ContextParam param) {
return get(param.name());
}
public Object get(final String key) {
return attributes.get(key);
}
public int getTrainCount() {
return (Integer) get(ContextParam.TRAIN_COUNT);
}
public TroopsInfo getTroopsInfo() {
return (TroopsInfo) this.get(ContextParam.TROOPS_INFO);
}
public void handle() throws BotException, InterruptedException {
current.handle(this);
}
public boolean isDisconnected() {
return disconnected;
}
public boolean isWaitDone() {
return waitDone;
}
public Object put(final ContextParam param, final Object value) {
param.check(value);
return attributes.put(param.name(), value);
}
public Object put(final String key, final Object value) {
Object result;
try {
final ContextParam param = Enum.valueOf(ContextParam.class, key);
result = put(param, value);
} catch (final IllegalArgumentException ex) {
result = attributes.put(key, value);
}
return result;
}
public void setDisconnected(final boolean disconnected) {
this.disconnected = disconnected;
}
public void setState(final State<?> state) {
logger.log(Level.FINE, "Next state to " + state.getClass().getSimpleName());
this.current = state;
if (state instanceof StateIdle) {
put(ContextParam.TRAIN_COUNT, 0);
}
if (state instanceof StateManageTroops) {
int trainCount = getTrainCount();
trainCount++;
put(ContextParam.TRAIN_COUNT, trainCount);
logger.log(Level.FINE, "Train count is " + trainCount);
}
}
public void setTroopsInfo(final TroopsInfo troopsInfo) {
this.put(ContextParam.TROOPS_INFO, troopsInfo);
}
public void setWaitDone(final boolean waitDone) {
this.waitDone = waitDone;
}
}