package org.projectfloodlight.openflow.types;

import org.projectfloodlight.openflow.util.HexString;

import com.google.common.primitives.Longs;
import com.google.common.primitives.UnsignedLongs;

/**
 * Abstraction of a datapath ID that can be set and/or accessed as either a
 * long value or a colon-separated string.
 *
 * @author Rob Vaterlaus <rob.vaterlaus@bigswitch.com>
 */
public class DatapathId implements Comparable<DatapathId> {

    public static final DatapathId NONE = new DatapathId(0);

    private final long rawValue;

    private DatapathId(long rawValue) {
        this.rawValue = rawValue;
    }

    public static DatapathId of(long rawValue) {
        return new DatapathId(rawValue);
    }

    public static DatapathId of(String s) {
        return new DatapathId(HexString.toLong(s));
    }

    public static DatapathId of(byte[] bytes) {
        return new DatapathId(Longs.fromByteArray(bytes));
    }

    public long getLong() {
        return rawValue;
    }

    public U64 getUnsignedLong() {
        return U64.of(rawValue);
    }

    public byte[] getBytes() {
        return Longs.toByteArray(rawValue);
    }

    @Override
    public String toString() {
        return HexString.toHexString(rawValue);
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + (int) (rawValue ^ (rawValue >>> 32));
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        DatapathId other = (DatapathId) obj;
        if (rawValue != other.rawValue)
            return false;
        return true;
    }

    @Override
    public int compareTo(DatapathId o) {
        return UnsignedLongs.compare(rawValue, o.rawValue);
    }
}
