/*
 * Copyright 2018-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.cfm.cli;

import org.apache.karaf.shell.commands.Argument;
import org.apache.karaf.shell.commands.Command;
import org.onosproject.cli.AbstractShellCommand;
import org.onosproject.incubator.net.l2monitoring.cfm.Mep;
import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmConfigException;
import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmMepService;
import org.onosproject.net.DeviceId;

/**
 * Lists all the MEPs on a particular device.
 */
@Command(scope = "onos", name = "cfm-mep-device-list",
        description = "Lists a set of MEPs filtered by device.")
public class CfmMepListDeviceCommand extends AbstractShellCommand {
    @Argument(name = "device",
            description = "Device Id",
            required = true)
    private String deviceStr = null;

    @Override
    protected void execute() {
        CfmMepService mepService = get(CfmMepService.class);
        if (deviceStr != null) {
            DeviceId deviceId = DeviceId.deviceId(deviceStr);
            try {
                mepService.getAllMepsByDevice(deviceId)
                        .forEach(mep -> print(printMep(mep)));
            } catch (CfmConfigException e) {
                log.error("Error retrieving Meps for Device {}",
                        deviceId, e);
            }
        }
    }

    /**
     * Print only the config part of the MEP.
     * @param mep The MEP to print
     * @return A string with MD name, MA name and Mep details
     */
    private static String printMep(Mep mep) {
         return "MEP: " + mep.mdId().mdName() + "/" + mep.maId().maName() + "/" +
                 mep.mepId() + " Device:" + mep.deviceId() + ", Port: " +
                 mep.port() + ", Vlan: " + mep.primaryVid() + ", AdminSt: " +
                 mep.administrativeState() + ", CciEnabled: " + mep.cciEnabled() +
                 ", Priority: " + mep.ccmLtmPriority();
    }

}
