/*
 * Copyright 2017-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.Command;
import org.apache.karaf.shell.commands.Argument;
import org.onosproject.cli.AbstractShellCommand;
import org.onosproject.incubator.net.l2monitoring.cfm.DefaultMaintenanceDomain;
import org.onosproject.incubator.net.l2monitoring.cfm.MaintenanceDomain;
import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdId;
import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmConfigException;
import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmMdService;

/**
 * Adds a Maintenance Domain to the existing list.
 */
@Command(scope = "onos", name = "cfm-md-add",
        description = "Add a CFM Maintenance Domain.")
public class CfmMdAddCommand extends AbstractShellCommand {

    @Argument(name = "name-type",
            description = "Maintenance Domain name type",
            required = true)
    private String nameType = null;

    @Argument(index = 1, name = "name",
            description = "Maintenance Domain name. Restrictions apply depending " +
                    "on name-type. Leave empty if name type is none",
            required = true)
    private String name = null;

    @Argument(index = 2, name = "level",
            description = "Maintenance Domain level LEVEL0-LEVEL7",
            required = true)
    private String level = null;

    @Argument(index = 3, name = "numeric-id",
            description = "An optional numeric id for Maintenance Domain [1-65535]")
    private Short numericId = null;

    @Override
    protected void execute() {
        CfmMdService service = get(CfmMdService.class);
        MdId mdId = CfmMdListMdCommand.parseMdName(name + "(" + nameType + ")");

        MaintenanceDomain.MdLevel levelEnum =
                MaintenanceDomain.MdLevel.valueOf(level);

        try {
            MaintenanceDomain.MdBuilder builder = DefaultMaintenanceDomain
                    .builder(mdId).mdLevel(levelEnum);
            if (numericId != null) {
                builder = builder.mdNumericId(numericId);
            }
            boolean created = service.createMaintenanceDomain(builder.build());
            print("Maintenance Domain with id %s is successfully %s.",
                    mdId, created ? "updated" : "created");
        } catch (CfmConfigException e) {
            throw new IllegalArgumentException(e);
        }
    }
}
