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

import java.util.Collection;

import org.apache.karaf.shell.commands.Command;
import org.apache.karaf.shell.commands.Option;
import org.onosproject.cli.AbstractShellCommand;
import org.onosproject.net.DeviceId;
import org.onosproject.vtnrsc.TenantNetworkId;
import org.onosproject.vtnrsc.VirtualPort;
import org.onosproject.vtnrsc.VirtualPortId;
import org.onosproject.vtnrsc.virtualport.VirtualPortService;

/**
 * Supports for querying virtualPorts.
 */
@Command(scope = "onos", name = "virtualports", description = "Supports for querying virtualPorts.")
public class VirtualPortQueryCommand extends AbstractShellCommand {

    @Option(name = "-v", aliases = "--vPortId", description = "virtualPort ID.", required = false,
            multiValued = false)
    String vPortId;

    @Option(name = "-n", aliases = "--networkId", description = "network ID.", required = false,
            multiValued = false)
    String networkId;

    @Option(name = "-d", aliases = "--deviceId", description = "device ID.", required = false,
            multiValued = false)
    String deviceId;

    @Option(name = "-t", aliases = "--tenantId", description = "tenant ID.", required = false,
            multiValued = false)
    String tenantId;

    private static final String FMT = "virtualPortId=%s, networkId=%s, name=%s,"
            + " tenantId=%s, deviceId=%s, adminStateUp=%s, state=%s,"
            + " macAddress=%s, deviceOwner=%s, fixedIp=%s, bindingHostId=%s,"
            + " bindingvnicType=%s, bindingvifType=%s, bindingvnicDetails=%s,"
            + " allowedAddress=%s, securityGroups=%s";

    @Override
    protected void execute() {
        VirtualPortService service = get(VirtualPortService.class);
        if (vPortId != null && networkId == null && deviceId == null && tenantId == null) {
            VirtualPort port = service.getPort(VirtualPortId.portId(vPortId));
            printPort(port);
        } else if (vPortId == null && networkId != null && deviceId == null && tenantId == null) {
            Collection<VirtualPort> ports = service.getPorts(TenantNetworkId.networkId(networkId));
            printPorts(ports);
        } else if (vPortId == null && networkId == null && deviceId != null && tenantId == null) {
            Collection<VirtualPort> ports = service.getPorts(DeviceId.deviceId(deviceId));
            printPorts(ports);
        } else if (vPortId == null && networkId == null && deviceId == null && tenantId != null) {
            Collection<VirtualPort> ports = service.getPorts(DeviceId.deviceId(tenantId));
            printPorts(ports);
        } else if (vPortId == null && networkId == null && deviceId == null && tenantId == null) {
            Collection<VirtualPort> ports = service.getPorts();
            printPorts(ports);
        } else {
            print("cannot input more than one parameter");
        }

    }

    private void printPorts(Collection<VirtualPort> ports) {
        for (VirtualPort port : ports) {
            printPort(port);
        }
    }

    private void printPort(VirtualPort port) {
        print(FMT, port.portId(), port.networkId(), port.name(), port.tenantId(), port.deviceId(),
              port.adminStateUp(), port.state(), port.macAddress(), port.deviceOwner(), port
                      .fixedIps(), port.bindingHostId(), port.bindingVnicType(),
              port.bindingVifType(), port.bindingVifDetails(), port.allowedAddressPairs(),
              port.securityGroups());
    }
}
