/*
 * 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 org.onosproject.net.DeviceId;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * Representation of stored VPN instance, which contains the configuration
 * such as RD and RT, also the device info and the VPN type.
 */
public class VpnInstance<T extends VpnConfig> {

    /**
     * VPN instance name.
     */
    private String vpnName;

    /**
     * List of devices for the VPN.
     */
    private Map<DeviceId, DeviceInfo> devInfo;

    /**
     * Type of the VPN.
     */
    private VpnType type;

    /**
     * VPN config information.
     */
    private T vpnConfig;

    /**
     * Creates VPN instance with VPN name.
     *
     * @param v VPN name
     */
    public VpnInstance(String v) {
        vpnName = v;
    }

    /**
     * Returns the type of the VPN instance.
     *
     * @return VPN type
     */
    VpnType type() {
        return type;
    }

    /**
     * Sets the type of the VPN instance.
     *
     * @param type VPN type
     */
    void type(VpnType type) {
        this.type = type;
    }

    /**
     * Returns the configuration of VPN instance.
     *
     * @return VPN config
     */
    T vpnConfig() {
        return vpnConfig;
    }

    /**
     * Sets the configuration of VPN instance.
     *
     * @param vpnConfig VPN config
     */
    void vpnConfig(T vpnConfig) {
        this.vpnConfig = vpnConfig;
    }

    /**
     * Returns the device info map.
     *
     * @return device info map
     */
    Map<DeviceId, DeviceInfo> devInfo() {
        return devInfo;
    }

    /**
     * Sets the device info map.
     *
     * @param devInfo device info map
     */
    void devInfo(Map<DeviceId, DeviceInfo> devInfo) {
        this.devInfo = devInfo;
    }

    /**
     * Adds the content to device info map.
     *
     * @param id   device id
     * @param info device info
     */
    void devInfo(DeviceId id, DeviceInfo info) {
        if (devInfo == null) {
            devInfo = new LinkedHashMap<>();
        }
        devInfo.put(id, info);
    }

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