/*
 * Copyright 2017-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.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.
     */
    public Map<RouteProtocol, ProtocolInfo> protocolInfo() {
        return protocolInfo;
    }

    /**
     * Sets the map of protocol info with route protocol as key value.
     *
     * @param protocolInfo protocol info map
     */
    public 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
     */
    public 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
     */
    public String vpnName() {
        return vpnName;
    }

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

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

