package net.onrc.onos.core.util;

import java.util.Objects;

import net.onrc.onos.core.util.serializers.IPv6Deserializer;
import net.onrc.onos.core.util.serializers.IPv6Serializer;

import org.codehaus.jackson.map.annotate.JsonDeserialize;
import org.codehaus.jackson.map.annotate.JsonSerialize;
import org.projectfloodlight.openflow.util.HexString;

/**
 * The class representing an IPv6 address.
 * This class is immutable.
 */
@JsonDeserialize(using = IPv6Deserializer.class)
@JsonSerialize(using = IPv6Serializer.class)
public final class IPv6 {
    private final long valueHigh;    // The higher (more significant) 64 bits
    private final long valueLow;     // The lower (less significant) 64 bits

    /**
     * Default constructor.
     */
    public IPv6() {
        this.valueHigh = 0;
        this.valueLow = 0;
    }

    /**
     * Copy constructor.
     *
     * @param other the object to copy from.
     */
    public IPv6(IPv6 other) {
        this.valueHigh = other.valueHigh;
        this.valueLow = other.valueLow;
    }

    /**
     * Constructor from integer values.
     *
     * @param valueHigh the higher (more significant) 64 bits of the address.
     * @param valueLow  the lower (less significant) 64 bits of the address.
     */
    public IPv6(long valueHigh, long valueLow) {
        this.valueHigh = valueHigh;
        this.valueLow = valueLow;
    }

    /**
     * Constructor from a string.
     *
     * @param value the value to use.
     */
    public IPv6(String value) {
        // TODO: Implement it!
        this.valueHigh = 0;
        this.valueLow = 0;
    }

    /**
     * Get the value of the higher (more significant) 64 bits of the address.
     *
     * @return the value of the higher (more significant) 64 bits of the
     * address.
     */
    public long valueHigh() {
        return valueHigh;
    }

    /**
     * Get the value of the lower (less significant) 64 bits of the address.
     *
     * @return the value of the lower (less significant) 64 bits of the
     * address.
     */
    public long valueLow() {
        return valueLow;
    }

    /**
     * Convert the IPv6 value to a ':' separated string.
     *
     * @return the IPv6 value as a ':' separated string.
     */
    @Override
    public String toString() {
        return HexString.toHexString(this.valueHigh) + ":" +
                HexString.toHexString(this.valueLow);
    }

    @Override
    public boolean equals(Object o) {
        if (!(o instanceof IPv6)) {
            return false;
        }
        IPv6 other = (IPv6) o;
        return this.valueHigh == other.valueHigh
                && this.valueLow == other.valueLow;
    }

    @Override
    public int hashCode() {
        return Objects.hash(valueHigh, valueLow);
    }
}
