import java.io.Serializable;

public class TalkMsg implements Serializable{
	/**
	 * La classe definisce i pacchetti che si possono
	 * scambiare Client e Server che realizzano un semplice 
	 * Instant Messanger. 
	 * I pacchetti possono essere creati con opportuni
	 * metodi statici: l'unico costruttore e' privato.
	 * Il campo 'code' determina il tipo del pacchetto.
	 * I possibili valori sono:
	 * 0 - normal line - contiene una stringa (la linea letta)
	 * 1 - connection request - contiene una porta (del Cliente)
	 * 2 - connection ack
	 * 3 - disconnection request
	 * 4 - disconnection ack
	 */
	
	private static final long serialVersionUID = 1L;
	public static final byte NORMAL = 0;
	public static final byte CONN_REQ = 1;
	public static final byte CONN_ACK = 2;
	public static final byte DISCONN_REQ = 3;
	public static final byte DISCONN_ACK = 4;
	
	private byte code;
	private String line;
	private int port;
	
	private TalkMsg(byte code, String line, int port){
		this.code = code;
		this.line = line;
		this.port = port;
	}
	
	/**
	 * Metodo per costruire un messaggio normale
	 * @param line la linea da spedire
	 * @return un messaggio con codice NORMAL
	 */
	public static TalkMsg getTMnormal(String line){
		return new TalkMsg(NORMAL,line,0);
	}
	

	/**
	 * Metodo per costruire un messaggio di richiesta connessione
	 * @param port la porta locale del Client
	 * @return un messaggio con codice CONN_REQ
	 */
	 public static TalkMsg getTMconnReq(int port){
		return new TalkMsg(CONN_REQ,null,port);
	 }	


	 /**
	  * Metodo per costruire un messaggio di ack per connessione
	  * @return un messaggio con codice CONN_ACK
	  */
	 public static TalkMsg getTMconnAck(){
		return new TalkMsg(CONN_ACK,null,0);
	 }


	 /**
	  * Metodo per costruire un messaggio di richiesta disconnessione
	  * @return un messaggio con codice DISCONN_REQ
	  */
	public static TalkMsg getTMdisconnReq(){
		return new TalkMsg(DISCONN_REQ,null,0);
	}


	 /**
	  * Metodo per costruire un messaggio di ack per disconnessione
	  * @return un messaggio con codice DISCONN_ACK
	  */
	public static TalkMsg getTMdisconnAck(){
		return new TalkMsg(DISCONN_ACK,null,0);
	}

	/**
	 * Metodi accessori
	 */
	public String getString(){
		return line;
	}
	
	public int getPort(){
		return port;
	}
	
	/**
	 * Metodi per ispezionare il tipo di messaggio
	 * @return
	 */
	
	public boolean isNormalLine(){
		return code == NORMAL;
	}
	public boolean isConnReq(){
		return code == CONN_REQ;
	}
	public boolean isConnAck(){
		return code == CONN_ACK;
	}

	public boolean isDisconnReq(){
		return code == DISCONN_REQ;
	}

	public boolean isDisconnAck(){
		return code == DISCONN_ACK;
	}
	
}
