//   Course Number: COSC 650 Data Comm/Networks
//    Program Name: JavaChat
//  Project Number: 2
//         Authors: Brian Hoffman
//                  Mike McKinney
//                  Javier Carrasco
//     Description:  This class is used by the server to represent data about 
//                   the chatrooms it is curretly managing. A ChatRoom is defined
//                   by its name, owner, and members/users. There are two constructors
//                   to be used.  One for a public chatroom and another which can
//                   be used for a private chat room (2 person)

import java.util.*;

public class ChatRoom
{
    private String roomName;
    private String owner;
    private Vector members;
    private ThreadedChatServer server;
    private boolean privRoom;
    
    /**
     * ------------------------------------------------------------------------
     * default constructor - creates a new instance of ChatClient and is not 
     *                       implements
     * ------------------------------------------------------------------------
     */
    public ChatRoom()
    {}

    /**
     * ------------------------------------------------------------------------
     * constructor for creating a new ChatRoom.  Would be used when creating
     * user created chatrooms
     * ------------------------------------------------------------------------
     */
    public ChatRoom(String rName, String rOwner, ThreadedChatServer rServer)
    {
        roomName = rName;
        owner = rOwner;
        server = rServer;
        members = new Vector(10,5);
        members.add(rOwner);
        privRoom = false;
    }

    /**
     * ------------------------------------------------------------------------
     * constructor for creating a new ChatRoom with 2 persons. This 
     * can be used to create private chatrooms with to people.
     * ------------------------------------------------------------------------
     */
    public ChatRoom(String rName, String rOwner, String othPart, ThreadedChatServer rServer)
    {
        roomName = rName;
        owner = rOwner;
        server = rServer;
        members = new Vector(2,1);
        members.add(rOwner);
        members.add(othPart);
        privRoom = true;
    }
 
    /**
     * ------------------------------------------------------------------------
     * isPrivate()
     * ------------------------------------------------------------------------
     */
    public boolean isPrivate()
    {
        if(privRoom)
            return(true);
        else
            return(false);
    }
    
    /**
     * ------------------------------------------------------------------------
     * method for adding a user to the chatroom
     * ------------------------------------------------------------------------
     */
    public boolean addUser(String newUser)
    {
        if(!members.contains(newUser))
        {
            this.broadcast(new ChatMessage("particAdd", "", roomName, newUser));
            members.add(newUser);
            ChatMessage m = new ChatMessage("roomAccept", "", roomName,"public," + this.getMembers());
            server.getClient(newUser).sendMessage(m);
            
            return(true);
        }
        else
            return(false);
    }
    
    /**
     * ------------------------------------------------------------------------
     * method for removing a user.  it will check to see if the String param 
     * is the owner ofthe room. If so, entire room will be deleted.  Else the 
     * individual user is removed
     * ------------------------------------------------------------------------
     */
    public void removeUser(String prevUser)
    {
        boolean success;
        
        if(prevUser.equals(this.getOwner()))
        {
            /* Delete room */ 
            members.remove(prevUser);
            this.broadcast(new ChatMessage("endRoom", "", this.roomName, ""));
            success = server.deleteRoom(this.roomName);
        }
        else
        {
            members.remove(prevUser);
            this.broadcast(new ChatMessage("leaveRoom", prevUser, this.roomName, ""));
        }
    }
 
    /**
     * ------------------------------------------------------------------------
     * bootUser
     * ------------------------------------------------------------------------
     */
    public void bootUser(String prevUser, ChatMessage m)
    {
        this.broadcast(m);
        members.remove(prevUser);
    }
    
    /**
     * ------------------------------------------------------------------------
     * method to return the owner of the chatroom.  The owner is 
     * essentially the creater.
     * ------------------------------------------------------------------------
     */
    public String getOwner()
    {  
        return(owner);
    }
    
    /**
     * ------------------------------------------------------------------------
     * method to return all members of the room
     * ------------------------------------------------------------------------
     */
    public String getMembers()
    {
        String allMembers = "";
        for(Enumeration e = members.elements(); e.hasMoreElements();)
        {
            String nextMember = (String)e.nextElement();
            if(allMembers.equals(""))
                allMembers = nextMember;
            else
                allMembers = allMembers + "," + nextMember;
        }
        return(allMembers);
    }
    
    /**
     * ------------------------------------------------------------------------
     *  Method to broadcast a message to all of the users in the room. 
     *  The message to be sent is specified as a parameter.
     *
     *  The method will get a list of the room members.  It will then loop 
     *  through the members, accessing their ChatClient objects and send
     *  the message via each ChatClients socket 
     * ------------------------------------------------------------------------
     */
    public void broadcast(ChatMessage message)
    {
        ChatClient tempClient;
        
        Iterator membIter = members.iterator();
        while(membIter.hasNext())
        {
            tempClient = server.getClient((String)membIter.next());
            tempClient.sendMessage(message);
        }
            
    }// end broadcast 
}// end class


