/*
 * Copyright 2015-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.bgp.controller;

import org.onosproject.bgpio.exceptions.BgpParseException;
import org.onosproject.bgpio.protocol.BgpMessage;

import java.util.List;
import java.util.Map;
import java.util.Set;

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

    /**
     * Returns list of bgp peers connected to this BGP controller.
     *
     * @return Iterable of BGPPeer elements
     */
    Iterable<BgpPeer> getPeers();

    /**
     * Returns the actual bgp peer for the given ip address.
     *
     * @param bgpId the id of the bgp peer to fetch
     * @return the interface to this bgp peer
     */
    BgpPeer getPeer(BgpId bgpId);

    /**
     * Register a listener for BGP message events.
     *
     * @param listener the listener to notify
     */
    void addListener(BgpNodeListener listener);

    /**
     * Unregister a listener.
     *
     * @param listener the listener to unregister
     */
    void removeListener(BgpNodeListener listener);

    /**
     * Send a message to a particular bgp peer.
     *
     * @param bgpId the id of the peer to send message.
     * @param msg   the message to send
     */
    void writeMsg(BgpId bgpId, BgpMessage msg);

    /**
     * Process a message and notify the appropriate listeners.
     *
     * @param bgpId id of the peer the message arrived on
     * @param msg   the message to process.
     * @throws BgpParseException on data processing error
     */
    void processBgpPacket(BgpId bgpId, BgpMessage msg) throws BgpParseException;

    /**
     * Close all connected BGP peers.
     */
    void closeConnectedPeers();

    /**
     * Get the BGPConfig class to the caller.
     *
     * @return configuration object
     */
    BgpCfg getConfig();

    /**
     * Get the BGP connected peers to this controller.
     *
     * @return the integer number
     */
    int connectedPeerCount();

    /**
     * Return BGP local RIB instance with VPN.
     *
     * @return BGPLocalRibImpl local RIB with VPN
     */
    BgpLocalRib bgpLocalRibVpn();

    /**
     * Return BGP local RIB instance.
     *
     * @return BGPLocalRibImpl local RIB
     */
    BgpLocalRib bgpLocalRib();

    /**
     * Return BGP peer manager.
     *
     * @return BGPPeerManager peer manager instance
     */
    BgpPeerManager peerManager();

    /**
     * Return BGP connected peers.
     *
     * @return connectedPeers connected peers
     */
    Map<BgpId, BgpPeer> connectedPeers();

    /**
     * Return BGP node listener.
     *
     * @return node listener
     */
    Set<BgpNodeListener> listener();

    /**
     * Register a listener for BGP message events.
     *
     * @param listener the listener to notify
     */
    void addLinkListener(BgpLinkListener listener);

    /**
     * Unregister a listener.
     *
     * @param listener the listener to unregister
     */
    void removeLinkListener(BgpLinkListener listener);

    /**
     * Return BGP link listener.
     *
     * @return link listener
     */
    Set<BgpLinkListener> linkListener();

    /**
     * Register a listener for BGP Prefix message events.
     *
     * @param listener the listener to notify
     */
    void addPrefixListener(BgpPrefixListener listener);

    /**
     * Unregister a listener for BGP Prefix message events.
     *
     * @param listener the listener to unregister
     */
    void removePrefixListener(BgpPrefixListener listener);

    /**
     * Returns set of BGP prefix listeners.
     *
     * @return set of BGP prefix listeners
     */
    Set<BgpPrefixListener> prefixListener();

    /**
     * Stores the exceptions occurred during an active session.
     *
     * @param peerId BGP peer id
     * @param exception exceptions based on the peer id.
     */
    void activeSessionExceptionAdd(String peerId, String exception);

    /**
     * Stores the exceptions occurred during an closed session.
     *
     * @param peerId BGP peer id
     * @param exception exceptions based on the peer id
     */
    void closedSessionExceptionAdd(String peerId, String exception);

    /**
     * Return active session exceptions.
     *
     * @return activeSessionMap
     */
    Map<String, List<String>> activeSessionMap();

    /**
     * Return closed session exceptions.
     *
     * @return closedSessionMap
     */
    Map<String, List<String>> closedSessionMap();
    /**
     * Register a listener for BGP message events.
     *
     * @param listener the listener to notify
     */
    void addRouteListener(BgpRouteListener listener);

    /**
     * Unregister a listener.
     *
     * @param listener the listener to unregister
     */
    void removeRouteListener(BgpRouteListener listener);

    /**
     * Return BGP route listener.
     *
     * @return route listener
     */
    Set<BgpRouteListener> routeListener();

}
