/*
 * Copyright 2018-present Open Networking Foundation
 *
 * 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.onosproject.xmpp.core;

/**
 * Abstraction of a XMPP controller. Serves as a one stop
 * shop for obtaining XMPP devices and (un)register listeners
 * on XMPP events
 */
public interface XmppController {

    /**
     * Method allows to retrieve XMPP device for given XmppDeviceId, if one exists.
     *
     * @param xmppDeviceId the device to retrieve
     * @return the interface to XMPP Device
     */
    XmppDevice getDevice(XmppDeviceId xmppDeviceId);

    /**
     * Register a listener for device events.
     *
     * @param deviceListener the listener to notify
     */
    void addXmppDeviceListener(XmppDeviceListener deviceListener);

    /**
     * Unregister a listener for device events.
     *
     * @param deviceListener the listener to unregister
     */
    void removeXmppDeviceListener(XmppDeviceListener deviceListener);

    /**
     * Register a listener for IQ stanza of XMPP protocol.
     *
     * @param iqListener the listener to notify
     */
    void addXmppIqListener(XmppIqListener iqListener);

    /**
     * Unregister a listener for IQ stanza of XMPP protocol.
     *
     * @param iqListener the listener to unregister
     */
    void removeXmppIqListener(XmppIqListener iqListener);

    /**
     * Register a listener for Message stanza of XMPP protocol.
     *
     * @param messageListener the listener to notify
     */
    void addXmppMessageListener(XmppMessageListener messageListener);

    /**
     * Unregister a listener for Message stanza of XMPP protocol.
     *
     * @param messageListener the listener to unregister
     */
    void removeXmppMessageListener(XmppMessageListener messageListener);

    /**
     * Register a listener for Presence stanza of XMPP protocol.
     *
     * @param presenceListener the listener to notify
     */
    void addXmppPresenceListener(XmppPresenceListener presenceListener);

    /**
     * Unregister a listener for Presence stanza of XMPP protocol.
     *
     * @param presenceListener the listener to unregister
     */
    void removeXmppPresenceListener(XmppPresenceListener presenceListener);

}
