package apz.pirichat.shared;
import java.net.Socket;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import apz.pirichat.server.Command;

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 Socket getSocket()
    {
        return mSocket;
    }

    public void sendMessage(Command pMessage) throws PiriNotConnectedException, IOException
    {
        if (isConnected() == false)
            throw new PiriNotConnectedException();
        mStreamOut.writeObject(pMessage);
        mStreamOut.flush();
    }

    public Command recieveMessage() throws PiriException, IOException, ClassNotFoundException
    {
        if (isConnected() == false)
            throw new PiriNotConnectedException();
        Object tempObj = mStreamIn.readObject();
        if ((tempObj instanceof Command) == false)
            throw new PiriNotChatMessageException(tempObj);
        return (Command)tempObj;
    }

    public boolean isMessageWaiting()
    {
        return true;
//        try{return(mStreamIn.available()>1);}
//        catch(IOException e) { System.out.println(e.toString()); return false; }
    }
}
