/*
 * libjingle
 * Copyright 2004--2005, Google Inc.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *  1. Redistributions of source code must retain the above copyright notice,
 *     this list of conditions and the following disclaimer.
 *  2. Redistributions in binary form must reproduce the above copyright notice,
 *     this list of conditions and the following disclaimer in the documentation
 *     and/or other materials provided with the distribution.
 *  3. The name of the author may not be used to endorse or promote products
 *     derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef TALK_XMPP_ROSTERMODULE_H_
#define TALK_XMPP_ROSTERMODULE_H_

#include "talk/xmpp/module.h"

namespace buzz {

class XmppRosterModule;

// The main way you initialize and use the module would be like this:
//    XmppRosterModule *roster_module = XmppRosterModule::Create();
//    roster_module->RegisterEngine(engine);
//    roster_module->BroadcastPresence();
//    roster_module->RequestRosterUpdate();

//! This enum captures the valid values for the show attribute in a presence
//! stanza
enum XmppPresenceShow
{
  XMPP_PRESENCE_CHAT = 0,
  XMPP_PRESENCE_DEFAULT = 1,
  XMPP_PRESENCE_AWAY = 2,
  XMPP_PRESENCE_XA = 3,
  XMPP_PRESENCE_DND = 4,
};

//! These are the valid subscription states in a roster contact.  This
//! represents the combination of the subscription and ask attributes
enum XmppSubscriptionState
{
  XMPP_SUBSCRIPTION_NONE = 0,
  XMPP_SUBSCRIPTION_NONE_ASKED = 1,
  XMPP_SUBSCRIPTION_TO = 2,
  XMPP_SUBSCRIPTION_FROM = 3,
  XMPP_SUBSCRIPTION_FROM_ASKED = 4,
  XMPP_SUBSCRIPTION_BOTH = 5,
};

//! These represent the valid types of presence stanzas for managing
//! subscriptions
enum XmppSubscriptionRequestType
{
  XMPP_REQUEST_SUBSCRIBE = 0,
  XMPP_REQUEST_UNSUBSCRIBE = 1,
  XMPP_REQUEST_SUBSCRIBED = 2,
  XMPP_REQUEST_UNSUBSCRIBED = 3,
};

enum XmppPresenceAvailable {
  XMPP_PRESENCE_UNAVAILABLE = 0,
  XMPP_PRESENCE_AVAILABLE   = 1,
  XMPP_PRESENCE_ERROR       = 2,
};

enum XmppPresenceConnectionStatus {
  XMPP_CONNECTION_STATUS_UNKNOWN    = 0,
  // Status set by the server while the user is being rung.
  XMPP_CONNECTION_STATUS_CONNECTING = 1,
  // Status set by the client when the user has accepted the ring but before
  // the client has joined the call.
  XMPP_CONNECTION_STATUS_JOINING    = 2,
  // Status set by the client as part of joining the call.
  XMPP_CONNECTION_STATUS_CONNECTED  = 3,
  XMPP_CONNECTION_STATUS_HANGUP     = 4,
};

//! Presence Information
//! This class stores both presence information for outgoing presence and is
//! returned by methods in XmppRosterModule to represent recieved incoming
//! presence information.  When this class is writeable (non-const) then each
//! update to any property will set the inner xml.  Setting the raw_xml will
//! rederive all of the other properties.
class XmppPresence {
public:
  virtual ~XmppPresence() {}

  //! Create a new Presence
  //! This is typically only used when sending a directed presence
  static XmppPresence* Create();

  //! The Jid of for the presence information.
  //! Typically this will be a full Jid with resource specified.
  virtual const Jid jid() const = 0;

  //! Is the contact available?
  virtual XmppPresenceAvailable available() const = 0;

  //! Sets if the user is available or not
  virtual XmppReturnStatus set_available(XmppPresenceAvailable available) = 0;

  //! The show value of the presence info
  virtual XmppPresenceShow presence_show() const = 0;

  //! Set the presence show value
  virtual XmppReturnStatus set_presence_show(XmppPresenceShow show) = 0;

  //! The Priority of the presence info
  virtual int priority() const = 0;

  //! Set the priority of the presence
  virtual XmppReturnStatus set_priority(int priority) = 0;

  //! The plain text status of the presence info.
  //! If there are multiple status because of language, this will either be a
  //! status that is not tagged for language or the first available
  virtual const std::string status() const = 0;

  //! Sets the status for the presence info.
  //! If there is more than one status present already then this will remove
  //! them all and replace it with one status element we no specified language
  virtual XmppReturnStatus set_status(const std::string& status) = 0;

  //! The connection status
  virtual XmppPresenceConnectionStatus connection_status() const = 0;

  //! The focus obfuscated GAIA id
  virtual const std::string google_user_id() const = 0;

  //! The nickname in the presence
  virtual const std::string nickname() const = 0;

  //! The raw xml of the presence update
  virtual const XmlElement* raw_xml() const = 0;

  //! Sets the raw presence stanza for the presence update
  //! This will cause all other data items in this structure to be rederived
  virtual XmppReturnStatus set_raw_xml(const XmlElement * xml) = 0;
};

//! A contact as given by the server
class XmppRosterContact {
public:
  virtual ~XmppRosterContact() {}

  //! Create a new roster contact
  //! This is typically only used when doing a roster update/add
  static XmppRosterContact* Create();

  //! The jid for the contact.
  //! Typically this will be a bare Jid.
  virtual const Jid jid() const = 0;

  //! Sets the jid for the roster contact update
  virtual XmppReturnStatus set_jid(const Jid& jid) = 0;

  //! The name (nickname) stored for this contact
  virtual const std::string name() const = 0;

  //! Sets the name
  virtual XmppReturnStatus set_name(const std::string& name) = 0;

  //! The Presence subscription state stored on the server for this contact
  //! This is never settable and will be ignored when generating a roster
  //! add/update request
  virtual XmppSubscriptionState subscription_state() const = 0;

  //! The number of Groups applied to this contact
  virtual size_t GetGroupCount() const = 0;

  //! Gets a Group applied to the contact based on index.
  //! range
  virtual const std::string GetGroup(size_t index) const = 0;

  //! Adds a group to this contact.
  //! This will return a bad argument error if the group is already there.
  virtual XmppReturnStatus AddGroup(const std::string& group) = 0;

  //! Removes a group from the contact.
  //! This will return an error if the group cannot be found in the group list.
  virtual XmppReturnStatus RemoveGroup(const std::string& group) = 0;

  //! The raw xml for this roster contact
  virtual const XmlElement* raw_xml() const = 0;

  //! Sets the raw presence stanza for the contact update/add
  //! This will cause all other data items in this structure to be rederived
  virtual XmppReturnStatus set_raw_xml(const XmlElement * xml) = 0;
};

//! The XmppRosterHandler is an interface for callbacks from the module
class XmppRosterHandler {
public:
  virtual ~XmppRosterHandler() {}

  //! A request for a subscription has come in.
  //! Typically, the UI will ask the user if it is okay to let the requester
  //! get presence notifications for the user.  The response is send back
  //! by calling ApproveSubscriber or CancelSubscriber.
  virtual void SubscriptionRequest(XmppRosterModule* roster,
                                   const Jid& requesting_jid,
                                   XmppSubscriptionRequestType type,
                                   const XmlElement* raw_xml) = 0;

  //! Some type of presence error has occured
  virtual void SubscriptionError(XmppRosterModule* roster,
                                 const Jid& from,
                                 const XmlElement* raw_xml) = 0;

  virtual void RosterError(XmppRosterModule* roster,
                           const XmlElement* raw_xml) = 0;

  //! New presence information has come in
  //! The user is notified with the presence object directly.  This info is also
  //! added to the store accessable from the engine.
  virtual void IncomingPresenceChanged(XmppRosterModule* roster,
                                       const XmppPresence* presence) = 0;

  //! A contact has changed
  //! This indicates that the data for a contact may have changed.  No
  //! contacts have been added or removed.
  virtual void ContactChanged(XmppRosterModule* roster,
                              const XmppRosterContact* old_contact,
                              size_t index) = 0;

  //! A set of contacts have been added
  //! These contacts may have been added in response to the original roster
  //! request or due to a "roster push" from the server.
  virtual void ContactsAdded(XmppRosterModule* roster,
                             size_t index, size_t number) = 0;

  //! A contact has been removed
  //! This contact has been removed form the list.
  virtual void ContactRemoved(XmppRosterModule* roster,
                              const XmppRosterContact* removed_contact,
                              size_t index) = 0;

};

//! An XmppModule for handle roster and presence functionality
class XmppRosterModule : public XmppModule {
public:
  //! Creates a new XmppRosterModule
  static XmppRosterModule * Create();
  virtual ~XmppRosterModule() {}

  //! Sets the roster handler (callbacks) for the module
  virtual XmppReturnStatus set_roster_handler(XmppRosterHandler * handler) = 0;

  //! Gets the roster handler for the module
  virtual XmppRosterHandler* roster_handler() = 0;

  // USER PRESENCE STATE -------------------------------------------------------

  //! Gets the aggregate outgoing presence
  //! This object is non-const and be edited directly.  No update is sent
  //! to the server until a Broadcast is sent
  virtual XmppPresence* outgoing_presence() = 0;

  //! Broadcasts that the user is available.
  //! Nothing with respect to presence is sent until this is called.
  virtual XmppReturnStatus BroadcastPresence() = 0;

  //! Sends a directed presence to a Jid
  //! Note that the client doesn't store where directed presence notifications
  //! have been sent.  The server can keep the appropriate state
  virtual XmppReturnStatus SendDirectedPresence(const XmppPresence* presence,
                                                const Jid& to_jid) = 0;

  // INCOMING PRESENCE STATUS --------------------------------------------------

  //! Returns the number of incoming presence data recorded
  virtual size_t GetIncomingPresenceCount() = 0;

  //! Returns an incoming presence datum based on index
  virtual const XmppPresence* GetIncomingPresence(size_t index) = 0;

  //! Gets the number of presence data for a bare Jid
  //! There may be a datum per resource
  virtual size_t GetIncomingPresenceForJidCount(const Jid& jid) = 0;

  //! Returns a single presence data for a Jid based on index
  virtual const XmppPresence* GetIncomingPresenceForJid(const Jid& jid,
                                                        size_t index) = 0;

  // ROSTER MANAGEMENT ---------------------------------------------------------

  //! Requests an update of the roster from the server
  //! This must be called to initialize the client side cache of the roster
  //! After this is sent the server should keep this module apprised of any
  //! changes.
  virtual XmppReturnStatus RequestRosterUpdate() = 0;

  //! Returns the number of contacts in the roster
  virtual size_t GetRosterContactCount() = 0;

  //! Returns a contact by index
  virtual const XmppRosterContact* GetRosterContact(size_t index) = 0;

  //! Finds a contact by Jid
  virtual const XmppRosterContact* FindRosterContact(const Jid& jid) = 0;

  //! Send a request to the server to add a contact
  //! Note that the contact won't show up in the roster until the server can
  //! respond.  This happens async when the socket is being serviced
  virtual XmppReturnStatus RequestRosterChange(
    const XmppRosterContact* contact) = 0;

  //! Request that the server remove a contact
  //! The jabber protocol specifies that the server should also cancel any
  //! subscriptions when this is done.  Like adding, this contact won't be
  //! removed until the server responds.
  virtual XmppReturnStatus RequestRosterRemove(const Jid& jid) = 0;

  // SUBSCRIPTION MANAGEMENT ---------------------------------------------------

  //! Request a subscription to presence notifications form a Jid
  virtual XmppReturnStatus RequestSubscription(const Jid& jid) = 0;

  //! Cancel a subscription to presence notifications from a Jid
  virtual XmppReturnStatus CancelSubscription(const Jid& jid) = 0;

  //! Approve a request to deliver presence notifications to a jid
  virtual XmppReturnStatus ApproveSubscriber(const Jid& jid) = 0;

  //! Deny or cancel presence notification deliver to a jid
  virtual XmppReturnStatus CancelSubscriber(const Jid& jid) = 0;
};

}

#endif  // TALK_XMPP_ROSTERMODULE_H_
