package net.onrc.onos.core.packetservice;

import net.onrc.onos.core.topology.MutableTopology;

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

/**
 * Notification to another ONOS instance to send a packet out a single port.
 */
public class SinglePacketOutNotification extends PacketOutNotification {

    private final int address;
    private final long outSwitch;
    private final short outPort;

    /**
     * Default constructor, used for deserialization.
     */
    protected SinglePacketOutNotification() {
        address = 0;
        outSwitch = 0;
        outPort = 0;
    }

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

        this.address = address;
        this.outSwitch = outSwitch;
        this.outPort = outPort;
    }

    /**
     * Get the dpid of the switch the packet will be sent out.
     *
     * @return the switch's dpid
     */
    public long getOutSwitch() {
        return outSwitch;
    }

    /**
     * Get the port number of the port the packet will be sent out.
     *
     * @return the port number
     */
    public short getOutPort() {
        return outPort;
    }

    /**
     * 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, MutableTopology mutableTopology) {
        Multimap<Long, Short> outPorts = HashMultimap.create();

        if (localPorts.containsEntry(outSwitch, outPort)) {
            outPorts.put(outSwitch, outPort);
        }

        return outPorts;
    }
}
