package org.lucci.madhoc.network.monitor.measure;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Vector;

import org.lucci.madhoc.network.Connection;
import org.lucci.madhoc.network.Station;
import org.lucci.madhoc.simulation.measure.NaturalNumberSensor;
import org.lucci.madhoc.simulation.measure.Unit;
import org.lucci.madhoc.simulation.projection.Projection;
import org.lucci.math.Utilities;
import org.lucci.util.Couple;

public class AvgTimeForRemeeting extends NaturalNumberSensor
{
    private Map<Couple<Station, Station>, Double> couples = new HashMap<Couple<Station, Station>, Double>();
    
    @Override
    public Double takeNewDoubleValue(Projection projection)
    {
        Collection<Double> remeetingTimes = new Vector<Double>();
        double time = projection.getNetwork().getSimulation().getSimulatedTime();
        double timeStep = 1 / projection.getNetwork().getSimulation().getResolution();

        for (Connection c : projection.getNetwork().getConnections())
        {
            Couple<Station, Station> couple = new Couple<Station, Station>(c.getNetworkInterface1().getNetworkingUnit().getStation(), c.getNetworkInterface2().getNetworkingUnit().getStation());
            Double lastTimeSeen = couples.get(couple);
            
            if (lastTimeSeen != null && lastTimeSeen < time - timeStep)
            {
                remeetingTimes.add(time - lastTimeSeen);
            }
            
            couples.put(couple, time);
        }
        
        // if no remeeting occured yet
        if (remeetingTimes.isEmpty())
        {
            return null;
        }
        else
        {
            return Utilities.getAverage(remeetingTimes);
        }
    }

    @Override
    public Unit getUnit()
    {
        return Unit.SECOND;
    }

    @Override
    public String getName()
    {
        return "avg time for re-meeting";
    }

}