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

import org.apache.karaf.shell.commands.Argument;
import org.apache.karaf.shell.commands.Command;
import org.onosproject.cli.AbstractShellCommand;
import org.onosproject.store.serializers.KryoNamespaces;
import org.onosproject.store.service.Serializer;
import org.onosproject.store.service.StorageService;
import org.onosproject.store.service.TransactionContext;
import org.onosproject.store.service.TransactionalMap;

/**
 * CLI command to put a value into a transactional map.
 */
@Command(scope = "onos", name = "transactional-map-test-put",
        description = "Put a value into a transactional map")
public class TransactionalMapTestPutCommand extends AbstractShellCommand {

    @Argument(index = 0, name = "numKeys",
            description = "Number of keys to put the value into",
            required = true, multiValued = false)
    private int numKeys = 1;

    @Argument(index = 1, name = "value",
            description = "Value to map with the keys in the map",
            required = true, multiValued = false)
    private String value = null;

    TransactionalMap<String, String> map;
    String prefix = "Key";
    String mapName = "Test-Map";
    Serializer serializer = Serializer.using(KryoNamespaces.BASIC);

    @Override
    protected void execute() {
        StorageService storageService = get(StorageService.class);
        TransactionContext context;
        context = storageService.transactionContextBuilder().build();
        context.begin();
        try {
            map = context.getTransactionalMap(mapName, serializer);
            for (int i = 1; i <= numKeys; i++) {
                String key = prefix + i;
                String response = map.put(key, value);
                if (response == null) {
                    print("Created Key %s with value %s.", key, value);
                } else {
                    print("Put %s into key %s. The old value was %s.", value, key, response);
                }
            }
            context.commit();
        } catch (Exception e) {
            context.abort();
            throw e;
        }
    }
}
