package apz.pirichat.shared;
import java.net.Socket;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import apz.pirichat.shared.ChatMessage;
import apz.pirichat.shared.PiriException;
import apz.pirichat.shared.PiriNotConnectedException;
import apz.pirichat.shared.PiriNotChatMessageException;

public class PiriSocket
{
    private Socket mSocket;
    private ObjectInputStream mStreamIn;
    private ObjectOutputStream mStreamOut;

    public PiriSocket(Socket pSocket) throws IOException
    {
        mSocket = pSocket;
        mStreamOut = new ObjectOutputStream(mSocket.getOutputStream());
        mStreamOut.flush();
        mStreamIn = new ObjectInputStream(mSocket.getInputStream());
    }

    public boolean isConnected()
    {
        return mSocket.isConnected();
    }

    public String getLocalAddress() throws PiriException
    {
        // Check to see whether socket is connected or not
        // If not, throw exception. Notice we have used false instead of !
        if (isConnected() == false)
            throw new PiriNotConnectedException();
        return (mSocket.getLocalAddress().toString() + ":" + mSocket.getLocalPort());
    }

    public String getRemoteAddress() throws PiriException
    {
        if (isConnected() == false)
            throw new PiriNotConnectedException();
        return (mSocket.getInetAddress().toString() + ":" + mSocket.getPort());
    }

    public void sendMessage(ChatMessage pMessage) throws PiriException, IOException
    {
        if (isConnected() == false)
            throw new PiriNotConnectedException();
        mStreamOut.writeObject(pMessage);
        mStreamOut.flush();
    }

    public ChatMessage recieveMessage() throws PiriException, IOException, ClassNotFoundException
    {
        if (isConnected() == false)
            throw new PiriNotConnectedException();
        Object tempObj = mStreamIn.readObject();
        if ((tempObj instanceof ChatMessage) == false)
            throw new PiriNotChatMessageException(tempObj);
        return (ChatMessage)tempObj;
    }

    public boolean isMessageWaiting()
    {
        return true;
//        try{return(mStreamIn.available()>1);}
//        catch(IOException e) { System.out.println(e.toString()); return false; }
    }
}
