/*
 * Copyright 2020-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.t3.api;

import com.google.common.collect.ImmutableMap;
import org.onosproject.net.config.Config;
import org.onosproject.net.config.basics.InterfaceConfig;
import org.onosproject.segmentrouting.config.SegmentRoutingDeviceConfig;
import org.slf4j.Logger;

import java.util.Map;

import static org.slf4j.LoggerFactory.getLogger;

/**
 * Represents Network Information Base (NIB) for network configurations
 * and supports alternative functions to
 * {@link org.onosproject.net.config.NetworkConfigService} for offline data.
 */
public class NetworkConfigNib {

    private static final Logger log = getLogger(NetworkConfigNib.class);

    // Map of str ConnectPoint : InterfaceConfig
    private Map<String, Config> portConfigMap;
    // Map of str DeviceId : SegmentRoutingDeviceConfig
    private Map<String, Config> deviceConfigMap;

    // use the singleton helper to create the instance
    protected NetworkConfigNib() {
    }

    /**
     * Sets a map of port : configuration to the port.
     *
     * @param portConfigMap port-config map
     */
    public void setPortConfigMap(Map<String, Config> portConfigMap) {
         this.portConfigMap = portConfigMap;
    }

    /**
     * Sets a map of device : configuration to the device.
     *
     * @param deviceConfigMap device-config map
     */
    public void setDeviceConfigMap(Map<String, Config> deviceConfigMap) {
        this.deviceConfigMap = deviceConfigMap;
    }

    /**
     * Returns the port-config map.
     *
     * @return port-config map
     */
    public Map<Object, Object> getPortConfigMap() {
        return ImmutableMap.copyOf(portConfigMap);
    }

    /**
     * Returns the device-config map.
     *
     * @return device-config map
     */
    public Map<Object, Object> getDeviceConfigMap() {
        return ImmutableMap.copyOf(deviceConfigMap);
    }

    /**
     * Returns the configuration for the specified subject and configuration
     * class if one is available; null otherwise.
     *
     * @param subject     configuration subject
     * @param configClass configuration class
     * @param <S>         type of subject
     * @param <C>         type of configuration
     * @return configuration or null if one is not available
     */
    public <S, C extends Config<S>> C getConfig(S subject, Class<C> configClass) {
        if (configClass.equals(InterfaceConfig.class)) {
            return (C) portConfigMap.get(subject.toString());
        } else if (configClass.equals(SegmentRoutingDeviceConfig.class)) {
            return (C) deviceConfigMap.get(subject.toString());
        } else {
            log.warn("Given configuration {} is not supported", configClass.toString());
            return null;
        }
    }

    /**
     * Returns the singleton instance of multicast routes NIB.
     *
     * @return instance of multicast routes NIB
     */
    public static NetworkConfigNib getInstance() {
        return NetworkConfigNib.SingletonHelper.INSTANCE;
    }

    private static class SingletonHelper {
        private static final NetworkConfigNib INSTANCE = new NetworkConfigNib();
    }

}
