package net.onrc.onos.core.util;

import java.math.BigInteger;

import net.onrc.onos.core.util.serializers.FlowEntryIdDeserializer;
import net.onrc.onos.core.util.serializers.FlowEntryIdSerializer;

import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.map.annotate.JsonDeserialize;
import org.codehaus.jackson.map.annotate.JsonSerialize;

/**
 * The class representing a Flow Entry ID.
 * This class is immutable.
 */
@JsonDeserialize(using = FlowEntryIdDeserializer.class)
@JsonSerialize(using = FlowEntryIdSerializer.class)
public final class FlowEntryId {
    private static final long INVALID = -1;
    private final long value;

    /**
     * Default constructor.
     */
    public FlowEntryId() {
        this.value = FlowEntryId.INVALID;
    }

    /**
     * Constructor from an integer value.
     *
     * @param value the value to use.
     */
    public FlowEntryId(long value) {
        this.value = value;
    }

    /**
     * Constructor from a string.
     *
     * @param value the value to use.
     */
    public FlowEntryId(String value) {
        //
        // Use the help of BigInteger to parse strings representing
        // large unsigned hex long values.
        //
        char c = 0;
        if (value.length() > 2) {
            c = value.charAt(1);
        }
        if ((c == 'x') || (c == 'X')) {
            this.value = new BigInteger(value.substring(2), 16).longValue();
        } else {
            this.value = Long.decode(value);
        }
    }

    /**
     * Get the value of the Flow Entry ID.
     *
     * @return the value of the Flow Entry ID.
     */
    public long value() {
        return value;
    }

    /**
     * Test whether the Flow Entry ID is valid.
     *
     * @return true if the Flow Entry ID is valid, otherwise false.
     */
    @JsonIgnore
    public boolean isValid() {
        return (this.value() != FlowEntryId.INVALID);
    }

    /**
     * Returns true of the object is another Flow Entry ID with
     * the same value; otherwise, returns false.
     *
     * @param Object to compare
     */
    @Override
    public boolean equals(Object obj) {
        if (obj != null && obj.getClass() == this.getClass()) {
            FlowEntryId entry = (FlowEntryId) obj;
            return this.value() == entry.value();
        }
        return false;
    }

    /**
     * Return the hash code of the Flow Entry ID.
     */
    @Override
    public int hashCode() {
        return Long.valueOf(value).hashCode();
    }

    /**
     * Convert the Flow Entry ID value to a hexadecimal string.
     *
     * @return the Flow Entry ID value to a hexadecimal string.
     */
    @Override
    public String toString() {
        return "0x" + Long.toHexString(this.value);
    }
}
