import processing.core.PApplet;
import processing.net.*;


//for abstracting the connection with the lisp server
// and for abstracting the server functions
public class LispServer {
	    private Client myClient = null;
	    private String m_ipAddr;
	    private int m_socket;
	    //private String sendString;
	    //private String recvString;
	    private PApplet m_parent;
	    LispServer(String ipAddr, int socketPort, PApplet parent) {
	        m_ipAddr = ipAddr;
	        m_socket = socketPort;
	        m_parent = parent;
	        if(!initialize_connection())
	            PApplet.println("Could not connect with the LISP server");
	    }
	    
	    public LispServer() {
	    }
	    
	    public Client getClient() {
	    	return myClient;
	    }
	    
	    public boolean initialize_connection() {
	        myClient = new Client(m_parent, m_ipAddr, m_socket);
	        if(myClient.active())
	            return true;
	        return false;
	    }
	    
	    public void setServerIP(String ipAddr) {
	        m_ipAddr = ipAddr;
	    }
	    
	    public void setSocketID(int socket) {
	        m_socket = socket;
	    }
	    
	    public boolean connect() {
	        if(myClient == null)
	            myClient = new Client(m_parent, m_ipAddr, m_socket);
	        if(myClient.active())
	            return true;    
	        return false;
	    }
	    
	    public void setMessage(String sText) {
	        //if(myClient.active())
	    	//System.out.println("About to send"+ sText);
	            myClient.write(sText+"\n");
	    }
	        
	    public String getMessage() {
	    	boolean done = false;
	    	String message = "";
	    	if (myClient.available()>0) {  
	    		//System.out.println("Some data available");
		    	do {
		    	      while(myClient.available()==0);
		    	      message = message + myClient.readString();
		    	      //System.out.println(message);	
		    	      if (message.charAt(message.length()-1)=='\n') done = true;  
		    	} while(!done);
	    	}
	        /*if (myClient.active() && myClient.available()>0)  
	            return recvString = myClient.readString();
	        return "";*/
	    	
	    	System.out.println("rawmessage=" + message);
	    	
	    	message = message.replace("\n", "");
	    	String[] messageTokens = message.split("\\)\\)\\)");
	    	System.out.println("messageTokens="+messageTokens);
	    	
	    	if (messageTokens.length >= 1)
	    		message = messageTokens[0] + ")))";
	    	if (messageTokens.length >= 2)
	    		message = message + "\n" + messageTokens[1] + ")))";
	    	if (messageTokens.length >= 3)
	    		message = message + "\n" + messageTokens[2] + ")))";
	    	message = message.replace("  ", " ");
	    	
	    	System.out.println("message=" + message);

	    	return message;
	    }
	    
	    public void closeConnection() {
	        if(myClient.active())
	            myClient.stop();
	    }
	    
}  
