/*
 * Copyright 2015 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.distributedprimitives.cli;

import org.apache.karaf.shell.commands.Argument;
import org.apache.karaf.shell.commands.Command;
import org.apache.karaf.shell.commands.Option;
import org.onlab.util.KryoNamespace;
import org.onosproject.cli.AbstractShellCommand;
import org.onosproject.store.serializers.KryoNamespaces;
import org.onosproject.store.service.Serializer;
import org.onosproject.store.service.StorageService;

import java.util.HashSet;
import java.util.Set;

/**
 * CLI command to get the elements in a distributed set.
 */
@Command(scope = "onos", name = "set-test-get",
        description = "Get the elements in a distributed set")
public class SetTestGetCommand extends AbstractShellCommand {

    @Option(name = "-s", aliases = "--size", description = "Also show the size of the set?",
            required = false, multiValued = false)
    private boolean size = false;

    @Argument(index = 0, name = "setName",
            description = "set name",
            required = true, multiValued = false)
    String setName = null;

    @Argument(index = 1, name = "values",
            description = "Check if the set contains these value(s)",
            required = false, multiValued = true)
    String[] values = null;

    Set<String> set;
    Set<String> toCheck = new HashSet<>();
    String output = "";

    Serializer serializer = Serializer.using(
            new KryoNamespace.Builder().register(KryoNamespaces.BASIC).build());


    @Override
    protected void execute() {
        StorageService storageService = get(StorageService.class);
        set = storageService.<String>setBuilder()
                .withName(setName)
                .withSerializer(serializer)
                .build();

        // Print the set size
        if (size) {
            print("There are %d items in set %s:", set.size(), setName);
        } else {
            print("Items in set %s:", setName);
        }
        // Print the set
        if (set.isEmpty()) {
            print("[]");
        } else {
            for (String e : set.toArray(new String[set.size()])) {
                if (output.isEmpty()) {
                    output += e;
                } else {
                    output += ", " + e;
                }
            }
            print("[%s]", output);
        }
        // Check if given values are in the set
        if (values == null) {
            return;
        } else if (values.length == 1) {
            // contains
            if (set.contains(values[0])) {
                print("Set %s contains the value %s", setName, values[0]);
            } else {
                print("Set %s did not contain the value %s", setName, values[0]);
            }
        } else if (values.length > 1) {
            //containsAll
            for (String value : values) {
                toCheck.add(value);
            }
            if (set.containsAll(toCheck)) {
                print("Set %s contains the the subset %s", setName, toCheck);
            } else {
                print("Set %s did not contain the the subset %s", setName, toCheck);
            }
        }
    }
}
