package net.onrc.onos.core.packetservice;

import java.util.Map;

import net.onrc.onos.core.topology.NetworkGraph;
import net.onrc.onos.core.topology.Port;

import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;

// TODO The generic broadcast packet shouldn't contain an IP address which is
// only for ARP packets.

/**
 * Notification to all ONOS instances to broadcast this packet out the edge of
 * the network. The edge is defined as any port that doesn't have a link to
 * another switch. The one exception is the port that the packet was received
 * on.
 */
public class BroadcastPacketOutNotification extends PacketOutNotification {

    private static final long serialVersionUID = 1L;

    private final int address;
    private final long inSwitch;
    private final short inPort;

    protected BroadcastPacketOutNotification() {
        super();
        this.address = -1;
        this.inSwitch = -1;
        this.inPort = -1;
    }

    /**
     * Class constructor.
     *
     * @param packet   packet data to send in the packet-out
     * @param address  target IP address if the packet is an ARP packet
     * @param inSwitch dpid of the switch the packet was received on
     * @param inPort   port number of the receiving port
     */
    public BroadcastPacketOutNotification(byte[] packet, int address,
                                          long inSwitch, short inPort) {
        super(packet);

        this.address = address;
        this.inSwitch = inSwitch;
        this.inPort = inPort;
    }

    /**
     * Get the dpid of the switch the packet was received on.
     *
     * @return receiving switch dpid
     */
    public long getInSwitch() {
        return inSwitch;
    }

    /**
     * Get the port number of the port the packet was received on.
     *
     * @return receiving port number
     */
    public short getInPort() {
        return inPort;
    }

    /**
     * Get the target IP address if the packet is an ARP packet.
     *
     * @return the target IP address for ARP packets, or null if the packet is
     * not an ARP packet
     */
    public int getTargetAddress() {
        return address;
    }

    @Override
    public Multimap<Long, Short> calculateOutPorts(
            Multimap<Long, Short> localPorts, NetworkGraph networkGraph) {
        Multimap<Long, Short> outPorts = HashMultimap.create();

        for (Map.Entry<Long, Short> entry : localPorts.entries()) {
            Port globalPort;
            networkGraph.acquireReadLock();
            try {
                globalPort = networkGraph.getPort(entry.getKey(),
                    entry.getValue().longValue());
            } finally {
                networkGraph.releaseReadLock();
            }

            if ((!entry.getKey().equals(inSwitch) ||
                    !entry.getValue().equals(inPort)) &&
                    globalPort != null &&
                    globalPort.getOutgoingLink() == null) {

                outPorts.put(entry.getKey(), entry.getValue());
            }
        }

        return outPorts;
    }
}
