/*
 * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
 * and is available at http://www.eclipse.org/legal/epl-v10.html
 */
package org.opendaylight.controller.sal.compability;

import org.opendaylight.controller.sal.core.*;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortFeatures;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;

public class ToSalPropertyClassUtils {
    public static Bandwidth salAdvertisedBandwidthFrom(NodeConnector nodeConnector) {
        FlowCapableNodeConnector flowCapNodeConn = nodeConnector.getAugmentation(FlowCapableNodeConnector.class);
        PortFeatures portFeatures = flowCapNodeConn.getAdvertisedFeatures();
        return new AdvertisedBandwidth(resolveBandwidth(portFeatures));
    }

    public static Bandwidth salPeerBandwidthFrom(NodeConnector nodeConnector) {
        FlowCapableNodeConnector flowCapNodeConn = nodeConnector.getAugmentation(FlowCapableNodeConnector.class);
        PortFeatures portFeatures = flowCapNodeConn.getPeerFeatures();
        return new PeerBandwidth(resolveBandwidth(portFeatures));
    }

    public static Bandwidth salSupportedBandwidthFrom(NodeConnector nodeConnector) {
        FlowCapableNodeConnector flowCapNodeConn = nodeConnector.getAugmentation(FlowCapableNodeConnector.class);
        PortFeatures portFeatures = flowCapNodeConn.getSupported();
        return new SupportedBandwidth(resolveBandwidth(portFeatures));
    }

    public static MacAddress salMacAddressFrom(NodeConnector nodeConnector) {
        FlowCapableNodeConnector flowCapNodeConn = nodeConnector.getAugmentation(FlowCapableNodeConnector.class);
        String hwAddress = flowCapNodeConn.getHardwareAddress().getValue();
        return new MacAddress(bytesFrom(hwAddress));
    }


    public static Name salNameFrom(NodeConnector nodeConnector) {
        FlowCapableNodeConnector flowCapNodeConn = nodeConnector.getAugmentation(FlowCapableNodeConnector.class);
        return new Name(flowCapNodeConn.getName());
    }



    private static byte[] bytesFrom(String hwAddress) {
        String[] mac = hwAddress.split(":");
        byte[] macAddress = new byte[6]; // mac.length == 6 bytes
        for (int i = 0; i < mac.length; i++) {
            macAddress[i] = Integer.decode("0x" + mac[i]).byteValue();
        }
        return macAddress;
    }

    private static long resolveBandwidth(PortFeatures portFeatures) {
        if (portFeatures.is_1tbFd()) {
            return Bandwidth.BW1Tbps;
        } else if (portFeatures.is_100gbFd()) {
            return Bandwidth.BW100Gbps;
        } else if (portFeatures.is_40gbFd()) {
            return Bandwidth.BW40Gbps;
        } else if (portFeatures.is_10gbFd()) {
            return Bandwidth.BW10Gbps;
        } else if (portFeatures.is_1gbHd() || portFeatures.is_1gbFd()) {
            return Bandwidth.BW1Gbps;
        } else if (portFeatures.is_100mbHd() || portFeatures.is_100mbFd()) {
            return Bandwidth.BW100Mbps;
        } else if (portFeatures.is_10mbHd() || portFeatures.is_10mbFd()) {
            return Bandwidth.BW10Mbps;
        } else {
            return Bandwidth.BWUNK;
        }
    }

}

@@ -359,55 +359,8 @@
 y;%0A%0A
-import org.opendaylight.controller.sal.core.*;%0A
 impo

fix sal-compatibility