/*
 * Copyright 2016 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.cli.net;

import org.apache.karaf.shell.commands.Command;
import org.onosproject.cli.AbstractShellCommand;
import org.onosproject.cli.Comparators;
import org.onosproject.incubator.net.key.DeviceKey;
import org.onosproject.incubator.net.key.DeviceKeyService;

import java.util.Collections;
import java.util.List;

import static com.google.common.collect.Lists.newArrayList;

/**
 * Lists all device keys.
 */
@Command(scope = "onos", name = "device-keys",
        description = "Lists all device keys")

public class DeviceKeyListCommand extends AbstractShellCommand {
    private static final String FMT_COMMUNITY_NAME =
            "identifier=%s, type=%s, community name=%s";
    private static final String FMT_USERNAME_PASSWORD =
            "identifier=%s, type=%s, username=%s, password=%s";

    @Override
    protected void execute() {
        DeviceKeyService service = get(DeviceKeyService.class);
        for (DeviceKey deviceKey : getSortedDeviceKeys(service)) {
            printDeviceKey(deviceKey);
        }
    }

    /**
     * Returns the list of devices keys sorted using the device key identifier.
     *
     * @param service device key service
     * @return sorted device key list
     */
    protected List<DeviceKey> getSortedDeviceKeys(DeviceKeyService service) {
        List<DeviceKey> deviceKeys = newArrayList(service.getDeviceKeys());
        Collections.sort(deviceKeys, Comparators.DEVICE_KEY_COMPARATOR);
        return deviceKeys;
    }

    /**
     * Prints out each device key.
     *
     * @param deviceKey the device key to be printed
     */
    private void printDeviceKey(DeviceKey deviceKey) {
        if (DeviceKey.Type.COMMUNITY_NAME.equals(deviceKey.type())) {
            print(FMT_COMMUNITY_NAME, deviceKey.deviceKeyId().id(), deviceKey.type(),
                  deviceKey.asCommunityName().name());
        } else if (DeviceKey.Type.USERNAME_PASSWORD.equals(deviceKey.type())) {
            print(FMT_USERNAME_PASSWORD, deviceKey.deviceKeyId().id(), deviceKey.type(),
                  deviceKey.asUsernamePassword().username(), deviceKey.asUsernamePassword().password());
        } else {
            log.error("Unsupported device key type: " + deviceKey.type());
        }
    }

}
