/*
 * Copyright (C) 2004-2006 Jive Software. All rights reserved.
 *
 * 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 org.jivesoftware.xmpp.workgroup;

import org.jivesoftware.xmpp.workgroup.request.Request;
import org.jivesoftware.xmpp.workgroup.request.UserRequest;
import org.xmpp.packet.JID;

/**
 * Users may try to join a workgroup using clients with different capabilities. Therefore, the
 * way for sending notifications to the user may differ depending on the client capabilities.<p>
 *
 * For instance, for sending notifications to a client that supports the
 * <a href="http://www.jabber.org/jeps/jep-0142.html">Workgroup protocol</a> packets that
 * follow the specification will be used. On the other hand, if a user contacted the workgroup
 * using a standard XMPP client that does not have support for the Workgroup protocol, using
 * possibly a chatbot, then standard XMPP packets with no special extensions will be used.
 *
 * @author Gaston Dombiak
 */
public interface UserCommunicationMethod {

    /**
     * Notifies the user his status in the waiting queue. Users will normaly receive a packet
     * that contains the position in the queue as well as the estimated remaining time.
     *
     * @param sender    the JID of the queue whose status is being notifed.
     * @param receiver  the JID of the user that will receive the notification.
     * @param request   the UserRequest that the user made to join a workgroup.
     * @param isPolling true if the user requested the information.
     */
    void notifyQueueStatus(JID sender, JID receiver, UserRequest request, boolean isPolling);

    /**
     * Notifies the user that he has left the waiting queue. Users may leave the waiting
     * queue because they cancelled their initial request or because no agent was found or
     * nobody accepted the request and the request timed out. This kind of notifications
     * usually include the reason for the departure.
     *
     * @param sender   the JID of the queue that the user left.
     * @param receiver the JID of the user that will receive the notification.
     * @param request  the UserRequest that the user made to join a workgroup.
     * @param type     the type of Cancel. The type will be used to explain the reason of the
     *                 departure.
     */
    void notifyQueueDepartued(JID sender, JID receiver, UserRequest request, Request.CancelType type);

    /**
     * Notification message saying that the request has been accepted by an agent and that
     * invitations have been sent to the agent and the user that made the request.
     *
     * @param request  the Request that the user made to join a workgroup.
     */
    void invitationsSent(UserRequest request);

    /**
     * Notification message saying that the user that made the request has joined the room to have
     * a chat with an agent.
     *
     * @param request  the Request that the user made to join a workgroup.
     */
    void supportStarted(UserRequest request);

    /**
     * Notification message saying that the support session with an agent has ended. Implementors
     * may decide to gather information about quality of service at this point.
     *
     * @param request  the Request that the user made to join a workgroup.
     */
    void supportEnded(UserRequest request);

    /**
     * A previous invitation to the specified room was not answered so offer again the user
     * the option to receive a new invitation. Different implementations may decide to unilaterally
     * send a new invitation while others may ask the user for his opinion.
     *
     * @param request the Request that the user made to join a workgroup.
     */
    void checkInvitation(UserRequest request);
}
