/*
 * Copyright 2021-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.kubevirtnetworking.cli;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import org.apache.commons.lang.StringUtils;
import org.apache.karaf.shell.api.action.Command;
import org.apache.karaf.shell.api.action.lifecycle.Service;
import org.onosproject.cli.AbstractShellCommand;
import org.onosproject.kubevirtnetworking.api.KubevirtSecurityGroup;
import org.onosproject.kubevirtnetworking.api.KubevirtSecurityGroupService;

import java.util.Comparator;
import java.util.List;

import static org.onosproject.kubevirtnetworking.api.Constants.CLI_ID_LENGTH;
import static org.onosproject.kubevirtnetworking.api.Constants.CLI_MARGIN_LENGTH;
import static org.onosproject.kubevirtnetworking.api.Constants.CLI_NAME_LENGTH;
import static org.onosproject.kubevirtnetworking.api.Constants.CLI_NUMBER_LENGTH;
import static org.onosproject.kubevirtnetworking.util.KubevirtNetworkingUtil.genFormatString;
import static org.onosproject.kubevirtnetworking.util.KubevirtNetworkingUtil.prettyJson;

/**
 * Lists kubevirt security groups.
 */
@Service
@Command(scope = "onos", name = "kubevirt-security-groups",
        description = "Lists all kubevirt security groups")
public class KubevirtListSecurityGroupCommand extends AbstractShellCommand {
    @Override
    protected void doExecute() throws Exception {
        KubevirtSecurityGroupService service = get(KubevirtSecurityGroupService.class);
        List<KubevirtSecurityGroup> sgs = Lists.newArrayList(service.securityGroups());
        sgs.sort(Comparator.comparing(KubevirtSecurityGroup::name));

        String format = genFormatString(ImmutableList.of(CLI_ID_LENGTH,
                CLI_NAME_LENGTH, CLI_NUMBER_LENGTH));

        if (outputJson()) {
            print("%s", json(sgs));
        } else {
            print(format, "ID", "Name", "# of Rules");

            for (KubevirtSecurityGroup sg : sgs) {
                print(format, StringUtils.substring(sg.id(), 0,
                        CLI_ID_LENGTH - CLI_MARGIN_LENGTH),
                        StringUtils.substring(sg.name(), 0,
                                CLI_NAME_LENGTH - CLI_MARGIN_LENGTH),
                        StringUtils.substring(String.valueOf(sg.rules().size()), 0,
                                CLI_NUMBER_LENGTH - CLI_MARGIN_LENGTH)
                );
            }
        }
    }

    private String json(List<KubevirtSecurityGroup> sgs) {
        ObjectMapper mapper = new ObjectMapper();
        ArrayNode result = mapper.createArrayNode();

        for (KubevirtSecurityGroup sg : sgs) {
            result.add(jsonForEntity(sg, KubevirtSecurityGroup.class));
        }

        return prettyJson(mapper, result.toString());
    }
}
