import com.sri.oaa2.com.*;
import com.sri.oaa2.lib.*;
import com.sri.oaa2.icl.*;


abstract class Agent
 {
	//REQUIRED FOR SETTING UP CONNECTION TO OAA LIBARY
	String[] libComString;
		
	//THIS IS THE AGENT LIBARY, THIS IS REQUIRED FOR ALL COMMUNICATION
	//BETWEEN AGENT AND OAA LIBARY, SETS UP TRANSPORT PROTOCOLS ETC		
	LibOaa agentLibary = new LibOaa(new LibCom(new LibComTcpProtocol(), libComString));
	
	String agentName;
	String agentCapablities;
		
	Agent()
	{   
		
	}
	
	
	public void facConnect()
	{
		//CONNECTS TO THE FACILITATOR
		if(!agentLibary.getComLib().comConnect("parent", IclUtils.icl("tcp(Host, Port)"), (IclList)IclUtils.icl("[]")));
		{    	//System.print.out("Connection failed");    	
		}
			
		//REGISTERS THIS AGENT TO THE FACILITATOR, GIVING THE AGENTS NAME AND SOLVABLES
		agentLibary.oaaRegister("parent", agentName, IclUtils.icl(agentCapablities), (IclList)IclUtils.icl("[]"));
						
		//STATES THAT THE AGENT IS READY AND READY TO PROCEED
		agentLibary.oaaReady(true);
				
		//REGISTERS THE AGENTS CALLBACK FACILITIES, A CALLBACK IS CALLED WHEN THE FACILITATOR			
		//REQUESTS A SERVICE FROM THE AGENT
		agentLibary.oaaRegisterCallback("oaa_AppDoEvent", new OAAEventListener() {
			
		//IF A CALLBACK REQUESTED OAADOEVENTCALLBACK IS CALLED
		public boolean doOAAEvent(IclTerm goal,	IclList params,	IclList answers)
		{
			return oaaDoEventCallback(goal, params, answers);
		}});
	}
	

	abstract boolean oaaDoEventCallback(IclTerm goal, IclList params, IclList answers);
	
	
	
	public IclStr createAnswer(String result)
	{
		//TURNS THEM INTO ICL FOR COMMUNICATION WITH FACILITATOR			
		IclStr respond = new IclStr(result.toString());
		
		return respond;						
		
	}		  
}	
