/*
 * Copyright 2017-present Open Networking Laboratory
 *
 * 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.l3vpn.netl3vpn;

import java.util.HashMap;
import java.util.Map;

/**
 * Representation of BGP information which contains the protocol info and the
 * VPN name.
 */
public class BgpInfo {

    /**
     * Map of route protocol and the protocol info for the BGP info.
     */
    private Map<RouteProtocol, ProtocolInfo> protocolInfo;

    /**
     * VPN name, to which the BGP info belongs.
     */
    private String vpnName;

    /**
     * Constructs BGP info.
     */
    public BgpInfo() {
    }

    /**
     * Returns the map of protocol info associated with the BGP info.
     *
     * @return protocol info map.
     */
    Map<RouteProtocol, ProtocolInfo> protocolInfo() {
        return protocolInfo;
    }

    /**
     * Sets the map of protocol info with route protocol as key value.
     *
     * @param protocolInfo protocol info map
     */
    void protocolInfo(Map<RouteProtocol, ProtocolInfo> protocolInfo) {
        this.protocolInfo = protocolInfo;
    }

    /**
     * Adds a protocol info with route protocol as key to the map.
     *
     * @param route route protocol
     * @param info  protocol info
     */
    void addProtocolInfo(RouteProtocol route, ProtocolInfo info) {
        if (protocolInfo == null) {
            protocolInfo = new HashMap<>();
        }
        protocolInfo.put(route, info);
    }

    /**
     * Returns the VPN name of the BGP info.
     *
     * @return VPN name
     */
    String vpnName() {
        return vpnName;
    }

    /**
     * Sets the VPN name.
     *
     * @param vpnName VPN name
     */
    void vpnName(String vpnName) {
        this.vpnName = vpnName;
    }

    @Override
    public String toString() {
        return "VPN name : " + vpnName;
    }
}

