/*
 * 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.provider.netconf.device.impl;

import com.fasterxml.jackson.databind.JsonNode;
import com.google.common.annotations.Beta;
import com.google.common.collect.Sets;
import org.onlab.packet.IpAddress;
import org.onosproject.core.ApplicationId;
import org.onosproject.net.config.ConfigException;
import org.onosproject.net.config.Config;

import java.util.Set;

/**
 * Configuration for Netconf provider.
 * @deprecated 1.10.0 Kingfisher
 */
@Beta
@Deprecated
public class NetconfProviderConfig extends Config<ApplicationId> {

    public static final String CONFIG_VALUE_ERROR = "Error parsing config value";
    private static final String IP = "ip";
    private static final int DEFAULT_TCP_PORT = 830;
    private static final String PORT = "port";
    private static final String NAME = "username";
    private static final String PASSWORD = "password";
    private static final String SSHKEY = "sshkey";

    public Set<NetconfDeviceAddress> getDevicesAddresses() throws ConfigException {
        Set<NetconfDeviceAddress> devicesAddresses = Sets.newHashSet();
        try {
            for (JsonNode node : array) {
                String ip = node.path(IP).asText();
                IpAddress ipAddr = ip.isEmpty() ? null : IpAddress.valueOf(ip);
                int port = node.path(PORT).asInt(DEFAULT_TCP_PORT);
                String name = node.path(NAME).asText();
                String password = node.path(PASSWORD).asText();
                String sshkey = node.path(SSHKEY).asText();
                devicesAddresses.add(new NetconfDeviceAddress(ipAddr, port, name, password, sshkey));

            }
        } catch (IllegalArgumentException e) {
            throw new ConfigException(CONFIG_VALUE_ERROR, e);
        }

        return devicesAddresses;
    }

    public class
    NetconfDeviceAddress {
        private final IpAddress ip;
        private final int port;
        private final String name;
        private final String password;
        private final String sshkey;

        public NetconfDeviceAddress(IpAddress ip, int port, String name, String password) {
            this.ip = ip;
            this.port = port;
            this.name = name;
            this.password = password;
            this.sshkey = "";
        }

        public NetconfDeviceAddress(IpAddress ip, int port, String name, String password, String sshkey) {
            this.ip = ip;
            this.port = port;
            this.name = name;
            this.password = password;
            this.sshkey = sshkey;
        }

        public IpAddress ip() {
            return ip;
        }

        public int port() {
            return port;
        }

        public String name() {
            return name;
        }

        public String password() {
            return password;
        }

        public String sshkey() {
            return sshkey;
        }
    }

}
