/*
 * 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.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.KubernetesExternalLb;
import org.onosproject.kubevirtnetworking.api.KubernetesExternalLbService;

import java.util.List;

import static org.onosproject.kubevirtnetworking.api.Constants.CLI_IP_ADDRESS_LENGTH;
import static org.onosproject.kubevirtnetworking.api.Constants.CLI_MAC_ADDRESS_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.util.KubevirtNetworkingUtil.genFormatString;

/**
 * Lists kubernetes services.
 */
@Service
@Command(scope = "onos", name = "kubernetes-services",
        description = "Lists all kubernetes services")
public class KubernetesListServiceCommand extends AbstractShellCommand {

    @Override
    protected void doExecute() throws Exception {
        KubernetesExternalLbService service = get(KubernetesExternalLbService.class);

        List<KubernetesExternalLb> elbList = Lists.newArrayList(service.loadBalancers());

        String format = genFormatString(ImmutableList.of(CLI_NAME_LENGTH, CLI_IP_ADDRESS_LENGTH,
                CLI_NAME_LENGTH, CLI_NAME_LENGTH, CLI_IP_ADDRESS_LENGTH, CLI_MAC_ADDRESS_LENGTH));


        print(format, "Service Name", "Loadbalancer IP", "Elected Gateway", "Elected Worker",
                "Loadbalancer GW IP", "Loadbalancer GW MAC");

        for (KubernetesExternalLb elb : elbList) {
            String lbIp = elb.loadBalancerIp() == null ? "N/A" : elb.loadBalancerIp().toString();
            String electedGw = elb.electedGateway() == null ? "N/A" : elb.electedGateway();
            String electedWorker = elb.electedWorker() == null ? "N/A" : elb.electedWorker();
            String lbGwIp = elb.loadBalancerGwIp() == null ? "N/A" : elb.loadBalancerGwIp().toString();
            String lbGwMac = elb.loadBalancerGwMac() == null ? "N/A" : elb.loadBalancerGwMac().toString();

            print(format, StringUtils.substring(elb.serviceName(), 0,
                    CLI_NAME_LENGTH - CLI_MARGIN_LENGTH),
                    StringUtils.substring(lbIp, 0,
                            CLI_IP_ADDRESS_LENGTH - CLI_MARGIN_LENGTH),
                    StringUtils.substring(electedGw, 0,
                            CLI_NAME_LENGTH - CLI_MARGIN_LENGTH),
                    StringUtils.substring(electedWorker, 0,
                            CLI_NAME_LENGTH - CLI_MARGIN_LENGTH),
                    StringUtils.substring(lbGwIp, 0,
                            CLI_IP_ADDRESS_LENGTH - CLI_MARGIN_LENGTH),
                    StringUtils.substring(lbGwMac, 0,
                            CLI_MAC_ADDRESS_LENGTH - CLI_MARGIN_LENGTH)
            );
        }
    }
}
