package net.onrc.onos.core.util;

import net.onrc.onos.core.util.serializers.IPv4Deserializer;
import net.onrc.onos.core.util.serializers.IPv4Serializer;

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

/**
 * The class representing an IPv4 address.
 * This class is immutable.
 */
@JsonDeserialize(using = IPv4Deserializer.class)
@JsonSerialize(using = IPv4Serializer.class)
public final class IPv4 {
    private final int value;

    /**
     * Default constructor.
     */
    public IPv4() {
        this.value = 0;
    }

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

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

    /**
     * Constructor from a string.
     *
     * @param value the value to use.
     */
    public IPv4(String value) {
        String[] splits = value.split("\\.");
        if (splits.length != 4) {
            throw new IllegalArgumentException("Specified IPv4 address must contain four " +
                    "numerical digits separated by '.'");
        }

        int result = 0;
        for (int i = 0; i < 4; ++i) {
            result |= Integer.parseInt(splits[i]) << ((3 - i) * 8);
        }
        this.value = result;
    }

    /**
     * Get the value of the IPv4 address.
     *
     * @return the value of the IPv4 address.
     */
    public int value() {
        return value;
    }

    /**
     * Convert the IPv4 value to a '.' separated string.
     *
     * @return the IPv4 value as a '.' separated string.
     */
    @Override
    public String toString() {
        return ((this.value >> 24) & 0xFF) + "." +
                ((this.value >> 16) & 0xFF) + "." +
                ((this.value >> 8) & 0xFF) + "." +
                (this.value & 0xFF);
    }

    @Override
    public boolean equals(Object o) {
        if (!(o instanceof IPv4)) {
            return false;
        }
        IPv4 other = (IPv4) o;
        if (this.value != other.value) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        return this.value;
    }
}
