package net.onrc.onos.api.newintent;

import net.onrc.onos.api.batchoperation.BatchOperationTarget;

/**
 * Intent identifier suitable as an external key.
 *
 * This class is immutable.
 */
public final class IntentId implements BatchOperationTarget {

    private static final int DEC = 10;
    private static final int HEX = 16;

    private final long id;

    /**
     * Creates an intent identifier from the specified string representation.
     *
     * @param value long value
     * @return intent identifier
     */
    public static IntentId valueOf(String value) {
        long id = value.startsWith("0x")
                ? Long.parseLong(value.substring(2), HEX)
                : Long.parseLong(value, DEC);
        return new IntentId(id);
    }


    /**
     * Constructs the ID corresponding to a given long value.
     *
     * @param id the underlying value of this ID
     */
    public IntentId(long id) {
        this.id = id;
    }

    @Override
    public int hashCode() {
        return (int) (id ^ (id >>> 32));
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == this) {
            return true;
        }

        if (!(obj instanceof IntentId)) {
            return false;
        }

        IntentId that = (IntentId) obj;
        return this.id == that.id;
    }

    @Override
    public String toString() {
        return "0x" + Long.toHexString(id);
    }

}
