package at.oefai.aaa.agent;

import java.util.Collection;
import java.util.List;
import java.util.concurrent.CountDownLatch;

import at.oefai.aaa.agent.jam.IEnvironment;
import at.oefai.aaa.agent.jam.WorldModelTableEvent;
import at.oefai.aaa.agent.jam.types.Value;
import at.oefai.aaa.thread.IPausable;
import at.oefai.aaa.thread.StoppableThread;

/**
 * Wrapper for the environment agent that is pausable.
 * @author Stefan Rank
 */
public class Environment implements IPausable, IEnvironment {
    private final StoppableThread stoppable; // = new StoppableThread(new DoIt());
    private final EnvironmentInterpreter envInterpreter;

    public Environment(final EnvironmentInterpreter pEnvInterpreter) {
        assert pEnvInterpreter != null;
        this.envInterpreter = pEnvInterpreter;
        this.stoppable = new StoppableThread(this.envInterpreter);
    }

    public final void execObserver() {
        this.envInterpreter.execObserver();
    }

    public final WorldModelTableEvent[] getPerceptionsOf(final String agentName) {
        return this.envInterpreter.getPerceptionsOf(agentName);
    }

    public final boolean requestAction(final String actor, final String actionName, final List<Value> arguments) {
        return this.envInterpreter.doAction(actor, actionName, arguments);
    }

    public final void start(final CountDownLatch startSignal) {
        this.stoppable.start(startSignal);
    }
    public final void pause(final CountDownLatch returnSignal) {
        this.stoppable.stop(returnSignal);
    }
    public final boolean isPaused() {
        return this.stoppable.isStopped();
    }

    public final void assertObjects(final Collection<String> pColl) {
        for (String obj : pColl) {
            this.envInterpreter.assertObject(obj);
        }
    }

    public final void assertAgents(final Collection<String> pColl) {
        for (String agent : pColl) {
            this.envInterpreter.assertAgent(agent);
        }
    }
}
