package net.onrc.onos.core.topology;

import java.util.Collection;

import net.floodlightcontroller.util.MACAddress;
import net.onrc.onos.core.util.Dpid;
import net.onrc.onos.core.util.PortNumber;
import net.onrc.onos.core.util.SwitchPort;

// TODO move to appropriate package. under api??
/**
 * BaseTopology interface common to both {@link ImmutableTopology} and {@link MutableTopology}.
 */
public interface BaseTopology {

    /**
     * Gets the switch for a given switch DPID.
     *
     * @param dpid the switch dpid.
     * @return the switch if found, otherwise null.
     */
    public Switch getSwitch(Dpid dpid);

    /**
     * Gets all switches in the network.
     *
     * @return all switches in the network.
     */
    public Iterable<Switch> getSwitches();

    /**
     * Gets the port on a switch.
     *
     * @param dpid   the switch DPID.
     * @param portNumber the switch port number.
     * @return the switch port if found, otherwise null.
     */
    public Port getPort(Dpid dpid, PortNumber portNumber);

    /**
     * Gets the port on a switch.
     *
     * @param port port identifier
     * @return the switch port if found, otherwise null.
     */
    public Port getPort(SwitchPort port);

    /**
     * Gets all ports on a switch specified.
     *
     * @param dpid Switch dpid
     * @return ports.
     */
    public Collection<Port> getPorts(Dpid dpid);

    /**
     * Gets the outgoing link from a switch port.
     * <p/>
     * FIXME As a temporary workaround, it will look for type "packet" and
     * returns it if found, else return whichever link is found first.
     *
     * @param dpid   the switch DPID.
     * @param portNumber the switch port number.
     * @return the outgoing link if found, otherwise null.
     */
    public Link getOutgoingLink(Dpid dpid, PortNumber portNumber);

    /**
     * Gets the outgoing link from a switch port.
     *
     * @param dpid   the switch DPID.
     * @param portNumber the switch port number.
     * @param type   type of the link
     * @return the outgoing link if found, otherwise null.
     */
    public Link getOutgoingLink(Dpid dpid, PortNumber portNumber, String type);

    /**
     * Gets the outgoing link from a switch port.
     * <p/>
     * FIXME As a temporary workaround, it will look for type "packet" and
     * returns it if found, else return whichever link is found first.
     *
     * @param port port identifier
     * @return the outgoing link if found, otherwise null.
     */
    public Link getOutgoingLink(SwitchPort port);

    /**
     * Gets the outgoing link from a switch port.
     *
     * @param port port identifier
     * @param type type of the link
     * @return the outgoing link if found, otherwise null.
     */
    public Link getOutgoingLink(SwitchPort port, String type);

    /**
     * Gets all the outgoing link from a switch port.
     *
     * @param port port identifier
     * @return outgoing links
     */
    public Collection<Link> getOutgoingLinks(SwitchPort port);

    /**
     * Gets the incoming link to a switch port.
     * <p/>
     * FIXME As a temporary workaround, it will look for type "packet" and
     * returns it if found, else return whichever link is found first.
     *
     * @param dpid   the switch DPID.
     * @param portNumber the switch port number.
     * @return the incoming link if found, otherwise null.
     */
    public Link getIncomingLink(Dpid dpid, PortNumber portNumber);

    /**
     * Gets the incoming link to a switch port.
     * <p/>
     * FIXME As a temporary workaround, it will look for type "packet" and
     * returns it if found, else return whichever link is found first.
     *
     * @param dpid   the switch DPID.
     * @param portNumber the switch port number.
     * @param type type of the link
     * @return the incoming link if found, otherwise null.
     */
    public Link getIncomingLink(Dpid dpid, PortNumber portNumber, String type);

    /**
     * Gets the incoming link to a switch port.
     * <p/>
     * FIXME As a temporary workaround, it will look for type "packet" and
     * returns it if found, else return whichever link is found first.
     *
     * @param port port identifier
     * @return the incoming link if found, otherwise null.
     */
    public Link getIncomingLink(SwitchPort port);

    /**
     * Gets the incoming link to a switch port.
     *
     * @param port port identifier
     * @param type type of the link
     * @return the incoming link if found, otherwise null.
     */
    public Link getIncomingLink(SwitchPort port, String type);

    /**
     * Gets all the incoming link from a switch port.
     *
     * @param port port identifier
     * @return incoming links
     */
    public Collection<Link> getIncomingLinks(SwitchPort port);

    /**
     * Gets the outgoing link from a switch and a port to another switch and
     * a port.
     *
     * @param srcDpid   the source switch DPID.
     * @param srcPortNumber the source switch port number.
     * @param dstDpid   the destination switch DPID.
     * @param dstPortNumber the destination switch port number.
     * @return the outgoing link if found, otherwise null.
     */
    public Link getLink(Dpid srcDpid, PortNumber srcPortNumber,
                        Dpid dstDpid, PortNumber dstPortNumber);

    /**
     * Gets the outgoing link from a switch and a port to another switch and
     * a port.
     *
     * @param srcDpid   the source switch DPID.
     * @param srcPortNumber the source switch port number.
     * @param dstDpid   the destination switch DPID.
     * @param dstPortNumber the destination switch port number.
     * @param type      type of the link
     * @return the outgoing link if found, otherwise null.
     */
    public Link getLink(Dpid srcDpid, PortNumber srcPortNumber,
                        Dpid dstDpid, PortNumber dstPortNumber,
                        String type);

    /**
     * Gets all links in the network.
     * <p/>
     *
     * @return all links in the network.
     */
    public Iterable<Link> getLinks();

    /**
     * Gets the network device for a given MAC address.
     *
     * @param address the MAC address to use.
     * @return the network device for the MAC address if found, otherwise null.
     */
    public Host getHostByMac(MACAddress address);

    /**
     * Gets all devices in the network.
     *
     * @return all devices in the network
     */
    public Iterable<Host> getHosts();

    /**
     * Gets all devices on specified port.
     *
     * @param port port which the device is attached
     * @return all devices attached to the port.
     */
    public Collection<Host> getHosts(SwitchPort port);
}
