package org.onlab.onos.net.host.impl;

import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.TimeUnit;

import org.jboss.netty.util.Timeout;
import org.jboss.netty.util.TimerTask;
import org.onlab.onos.net.Host;
import org.onlab.onos.net.Port;
import org.onlab.onos.net.device.DeviceService;
import org.onlab.onos.net.host.HostProvider;
import org.onlab.onos.net.host.HostService;
import org.onlab.onos.net.packet.PacketProvider;
import org.onlab.onos.net.topology.TopologyService;
import org.onlab.packet.IpPrefix;
import org.onlab.util.Timer;

public class HostMonitor implements TimerTask {

    private final HostService hostService;
    private final TopologyService topologyService;
    private final DeviceService deviceService;
    private final HostProvider hostProvider;
    private final PacketProvider packetProvider;

    private final Set<IpPrefix> monitoredAddresses;

    private final long probeRate;

    private Timeout timeout;

    public HostMonitor(HostService hostService, TopologyService topologyService,
                       DeviceService deviceService,
                       HostProvider hostProvider, PacketProvider packetProvider) {
        this.hostService = hostService;
        this.topologyService = topologyService;
        this.deviceService = deviceService;
        this.hostProvider = hostProvider;
        this.packetProvider = packetProvider;

        monitoredAddresses = new HashSet<>();

        probeRate = 30000; // milliseconds

        timeout = Timer.getTimer().newTimeout(this, 0, TimeUnit.MILLISECONDS);
    }

    public void addMonitoringFor(IpPrefix ip) {
        monitoredAddresses.add(ip);
    }

    public void stopMonitoring(IpPrefix ip) {
        monitoredAddresses.remove(ip);
    }

    public void shutdown() {
        timeout.cancel();
    }

    @Override
    public void run(Timeout timeout) throws Exception {
        for (IpPrefix ip : monitoredAddresses) {
            Set<Host> hosts = hostService.getHostsByIp(ip);

            if (hosts.isEmpty()) {
                sendArpRequest(ip);
            } else {
                for (Host host : hosts) {
                    hostProvider.triggerProbe(host);
                }
            }
        }

        timeout = Timer.getTimer().newTimeout(this, probeRate, TimeUnit.MILLISECONDS);
    }

    /**
     * Sends an ARP request for the given IP address.
     *
     * @param targetIp IP address to ARP for
     */
    private void sendArpRequest(IpPrefix targetIp) {
        // emit ARP packet out appropriate ports

        // if ip in one of the configured (external) subnets
        //   sent out that port
        // else (ip isn't in any configured subnet)
        //   send out all non-external edge ports

        /*for (Device device : deviceService.getDevices()) {
            for (Port port : deviceService.getPorts(device.id())) {
                for (IpPrefix ip : port.ipAddresses()) {
                    if (ip.contains(targetIp)) {
                        sendProbe(port, targetIp);
                        continue;
                    }
                }
            }
        }*/

    }

    private void sendProbe(Port port, IpPrefix targetIp) {

    }
}
