package net.onrc.onos.apps.sdnip;

import java.net.InetAddress;

import net.onrc.onos.core.util.SwitchPort;

import org.codehaus.jackson.annotate.JsonCreator;
import org.codehaus.jackson.annotate.JsonProperty;
import org.projectfloodlight.openflow.util.HexString;

import com.google.common.net.InetAddresses;

/**
 * Represents an interface, which is an external-facing switch port that
 * connects to another network.
 *
 * SDN-IP treats external-facing ports similarly to router ports. Logically, it
 * assigns an IP address to these ports which is used for communication with
 * the BGP peers, for example, the BGP peering session. The other peer will be
 * configured to peer with the IP address (logically) assigned to the
 * interface. The logical {@code Interface} construct maps on to a physical port in the
 * data plane, which of course has no notion of IP addresses.
 *
 * Each interface has a name, which is a unique identifying String that is used
 * to reference this interface in the configuration (for example, to map
 * {@link BgpPeer}s to {@code Interfaces}.
 */
public class Interface {
    private final String name;
    private final long dpid;
    private final short port;
    private final InetAddress ipAddress;
    private final int prefixLength;
    private final SwitchPort switchPort;

    /**
     * Class constructor used by the JSON library to create an object.
     *
     * @param name the name of the interface
     * @param dpid the dpid of the switch
     * @param port the port on the switch
     * @param ipAddress the IP address logically assigned to the interface
     * @param prefixLength the length of the network prefix of the IP address
     */
    @JsonCreator
    public Interface(@JsonProperty("name") String name,
                     @JsonProperty("dpid") String dpid,
                     @JsonProperty("port") short port,
                     @JsonProperty("ipAddress") String ipAddress,
                     @JsonProperty("prefixLength") int prefixLength) {
        this.name = name;
        this.dpid = HexString.toLong(dpid);
        this.port = port;
        this.ipAddress = InetAddresses.forString(ipAddress);
        this.prefixLength = prefixLength;
        switchPort = new SwitchPort(this.dpid, this.port);
    }

    /**
     * Gets the name of the interface.
     *
     * @return the name of the interface
     */
    public String getName() {
        return name;
    }

    /**
     * Gets the {@link SwitchPort} that this interface maps to.
     *
     * @return the switch port
     */
    public SwitchPort getSwitchPort() {
        return switchPort;
    }

    /**
     * Gets the DPID of the switch.
     *
     * @return the DPID of the switch
     */
    public long getDpid() {
        return dpid;
    }

    /**
     * Gets the port number this interface maps to.
     *
     * @return the port number
     */
    public short getPort() {
        return port;
    }

    /**
     * Gets the IP address which is logically assigned to the switch port.
     *
     * @return the IP address
     */
    public InetAddress getIpAddress() {
        return ipAddress;
    }

    /**
     * Gets the prefix length of the interface's IP address.
     *
     * @return the prefix length
     */
    public int getPrefixLength() {
        return prefixLength;
    }

    @Override
    public boolean equals(Object other) {
        if (!(other instanceof Interface)) {
            return false;
        }

        Interface otherInterface = (Interface) other;

        // Don't check switchPort as it is comprised of dpid and port
        return (name.equals(otherInterface.name)) &&
                (dpid == otherInterface.dpid) &&
                (port == otherInterface.port) &&
                (ipAddress.equals(otherInterface.ipAddress)) &&
                (prefixLength == otherInterface.prefixLength);
    }

    @Override
    public int hashCode() {
        int hash = 17;
        hash = 31 * hash + name.hashCode();
        hash = 31 * hash + (int) (dpid ^ dpid >>> 32);
        hash = 31 * hash + (int) port;
        hash = 31 * hash + ipAddress.hashCode();
        hash = 31 * hash + prefixLength;
        return hash;
    }
}
