package org.greenstone.atlas.server;

import java.util.ArrayList;
import java.util.HashMap;

import org.greenstone.atlas.client.Place;
import org.greenstone.atlas.server.ServerPlace;

public class ScanResultSet
{
	HashMap<String, ServerPlace> _resultSet = new HashMap<String, ServerPlace>(); 
	String _name = null;

	/*
	public ScanResultSet(String name, ArrayList<ServerPlace> results, Object nothing)
	{
		_name = name;
		for(ServerPlace p : results)
		{
			if(_resultSet.containsKey(p.getName()))
			{
				ServerPlace old = _resultSet.get(p.getName());
				if (p.getScore() > old.getScore())
				{
					_resultSet.put(p.getName(), p);
				}
			}
			else
			{
				_resultSet.put(p.getName(), p);
			}
		}
	}
	*/
	public ScanResultSet(String name, ArrayList<Place> results)
	{
		_name = name;
		for(Place p : results)
		{
			if(_resultSet.containsKey(p.getName()))
			{
				ServerPlace old = _resultSet.get(p.getName());
				if (p.getScore() > old.getScore())
				{
					_resultSet.put(p.getName(), ServerPlace.convert(p));
				}
				else if(p.getScore() == old.getScore())
				{
					if(p.getPopulation() > old.getPopulation())
					{
						_resultSet.put(p.getName(), ServerPlace.convert(p));
					}
				}
			}
			else
			{
				_resultSet.put(p.getName(), ServerPlace.convert(p));
			}
		}
	}
	
	public ScanResultSet(String name, Long[] ids)
	{
		_name = name;
		for(int i = 0; i < ids.length; i++)
		{
//			if(i >= ids.length)
//			{
//				return;
//			}
			
			ServerPlace p = ServerPlace.createPlaceFromId(ids[i]);
			
			if(PlaceInformation.getPlaces(p.getName()).size() > 1)
			{
				_resultSet.put(p.getName(), p);
			}
			//_resultSet.put(p.getName(), p);
		}
	}
	
	public int[] compareResults (ScanResultSet otherResults)
	{
		if(otherResults == null)
		{
			return null;
		}
		
		int count = 0;
		int total = 0;
		for(String s : _resultSet.keySet())
		{
			if(otherResults.getResult(s) != null && otherResults.getResult(s).equals(_resultSet.get(s)))
			{
				count++;
			}
			else
			{
				if(otherResults.getResult(s) != null)
				{
					//System.out.println(_resultSet.get(s).getName() + ", " + _resultSet.get(s).getParentPlaceName() +  " (" + _resultSet.get(s).getScore() + ") != " + otherResults.getResult(s).getName() + ", " + otherResults.getResult(s).getParentPlaceName() + " (" + otherResults.getResult(s).getScore() + ")");
				}
				else
				{
					//System.out.println(_resultSet.get(s).getName() + ", " + _resultSet.get(s).getParentPlaceName() + " != " + otherResults.getResult(s));
				}
			}
			total++;
		}
		
		System.out.println("Result = " + count + "/" + total);
		
		return new int[]{count, total};
	}
	
	public ServerPlace getResult(String key)
	{
		return _resultSet.get(key);
	}
	
	public String getName()
	{
		return _name;
	}

	public void updateScores(ArrayList<Place> places)
	{
		for(String s : _resultSet.keySet())
		{
			for(int i = 0; i < places.size(); i++)
			{
				if(_resultSet.get(s).equals(places.get(i)) && _resultSet.get(s).getScore() < places.get(i).getScore())
				{
					_resultSet.get(s).setScore(places.get(i).getScore());
				}
			}
		}
	}
}
