package org.lucci.madhoc.network.util;

import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;

import org.lucci.madhoc.network.Station;
import org.lucci.madhoc.network.Connection;
import org.lucci.madhoc.network.Network;
import org.lucci.up.data.Point;

/*
 * Created on Aug 26, 2004
 */

/**
 * @author luc.hogie
 */
public class Geometry
{
    public static double getAverageDistanceBetweenStationsInRange(Network net)
    {
        double distanceSum = 0;
        Iterator connectionIterator = net.getConnections().iterator();
        
        while (connectionIterator.hasNext())
        {
            Connection connection = (Connection) connectionIterator.next();
            distanceSum += connection.getDistance();
        }
        
        return distanceSum / net.getConnections().size();
    }


    public static List<Station> getStationsOrderByTheirDistanceToTheBarycenter(Network net)
    {
        List<Station> list = new Vector<Station>(net.getStations());
        final Point barycenter = getBarycenter(net);
        Collections.sort(list, new Comparator<Station>()
                {
                    public int compare(Station s0, Station s1)
                    {
                        double d0 = s0.getLocation().getDistanceTo(barycenter); 
                        double d1 = s1.getLocation().getDistanceTo(barycenter); 
                        return Double.compare(d0, d1);
                    }
                });
        
        return list;
    }

    public static Point getBarycenter(Network net)
    {
        Collection<Station> stationSet = net.getStations(); 

        if (stationSet.isEmpty())
            throw new IllegalArgumentException("no stations");

        double xsum = 0, ysum = 0;

        for (Station station : stationSet)
        {
            Point p = station.getLocation();
            xsum += p.getX();
            ysum += p.getY();
        }

        return new Point(xsum / stationSet.size(), ysum / stationSet.size());
    }

}