/*
 * Jitsi, the OpenSource Java VoIP and Instant Messaging client.
 *
 * Copyright @ 2015 Atlassian Pty Ltd
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package net.java.sip.communicator.service.protocol;

import java.util.*;

import net.java.sip.communicator.service.protocol.event.*;

/**
 * Represents an ad-hoc rendez-vous point where multiple chat users could
 * communicate together. This interface describes the main methods used by some
 * protocols for multi user chat, without useless methods (such as kicking a
 * participant) which aren't supported by these protocols (MSN, ICQ, etc.).
 *
 * <tt>AdHocChatRoom</tt> acts like a simplified <tt>ChatRoom</tt>.
 *
 * @author Valentin Martinet
 */
public interface AdHocChatRoom
{
    /**
     * Returns the name of this <tt>AdHocChatRoom</tt>. The name can't be
     * changed until the <tt>AdHocChatRoom</tt> is ended.
     *
     * @return a <tt>String</tt> containing the name
     */
    public String getName();

    /**
     * Returns the identifier of this <tt>AdHocChatRoom</tt>. The identifier of
     * the ad-hoc chat room would have the following syntax:
     * [adHocChatRoomName]@[adHocChatRoomServer]@[accountID]
     *
     * @return a <tt>String</tt> containing the identifier of this
     * <tt>AdHocChatRoom</tt>.
     */
    public String getIdentifier();

    /**
     * Adds a listener that will be notified of changes in our participation in
     * the ad-hoc room such as us being join, left...
     *
     * @param listener a member participation listener.
     */
    public void addParticipantPresenceListener(
            AdHocChatRoomParticipantPresenceListener listener);

    /**
     * Removes a participant presence listener.
     *
     * @param listener a member participation listener.
     */
    public void removeParticipantPresenceListener(
            AdHocChatRoomParticipantPresenceListener listener);

    /**
     * Registers <tt>listener</tt> so that it would receive events every time a
     * new message is received on this ad-hoc chat room.
     *
     * @param listener a <tt>MessageListener</tt> that would be notified every
     * time a new message is received on this ad-hoc chat room.
     */
    public void addMessageListener(AdHocChatRoomMessageListener listener);

    /**
     * Removes <tt>listener</tt> so that it won't receive any further message
     * events from this ad-hoc room.
     *
     * @param listener the <tt>MessageListener</tt> to remove from this ad-hoc
     * room
     */
    public void removeMessageListener(AdHocChatRoomMessageListener listener);

    /**
     * Invites another <tt>Contact</tt> to this ad-hoc chat room.
     *
     * @param userAddress the address of the <tt>Contact</tt> of the user to
     * invite to the ad-hoc room.
     * @param reason a reason, subject, or welcome message that would tell
     * users why they are being invited.
     */
    public void invite(String userAddress, String reason);

    /**
     * Returns a <tt>List</tt> of <tt>Contact</tt>s corresponding to all
     * participants currently participating in this room.
     *
     * @return a <tt>List</tt> of <tt>Contact</tt>s instances
     * corresponding to all room members.
     */
    public List<Contact> getParticipants();

    /**
     * Returns the number of participants that are currently in this ad-hoc
     * chat room.
     * @return int the number of <tt>Contact</tt>s, currently participating in
     * this ad-hoc room.
     */
    public int getParticipantsCount();

    /**
     * Create a <tt>Message</tt> instance for sending a simple text messages
     * with default (text/plain) content type and encoding.
     *
     * @param messageText the string content of the message.
     * @return Message the newly created message
     */
    public Message createMessage(String messageText);

    /**
     * Sends the <tt>Message</tt> to this ad-hoc chat room.
     *
     * @param message the <tt>Message</tt> to send.
     * @throws OperationFailedException if sending the message fails for some
     * reason.
     */
    public void sendMessage(Message message)
        throws OperationFailedException;

    /**
     * Returns a reference to the provider that created this room.
     *
     * @return a reference to the <tt>ProtocolProviderService</tt> instance
     * that created this ad-hoc room.
     */
    public ProtocolProviderService getParentProvider();

    /**
     * Joins this ad-hoc chat room with the nickname of the local user so that
     * the user would start receiving events and messages for it.
     *
     * @throws OperationFailedException with the corresponding code if an error
     * occurs while joining the ad-hoc room.
     */
    public void join()
        throws OperationFailedException;

    /**
     * Leaves this chat room. Once this method is called, the user won't be
     * listed as a member of the chat room any more and no further chat events
     * will be delivered.
     */
    public void leave();
}
