///Maybe we should look into Voronoi diagrams to optimize this :P
///@return the closest metal spot to a given position
SAIFloat3 ConstructionUnitGroup::FindClosestMetalExtractionSite(SAIFloat3 pos, bool checkIfItBlocks/*, Resource* metal */ )
{
	ai->utility->Log(ALL, MISC, "FindClosestMetalExtractionSite...");
	UnitDef *mexDef = ai->utility->GetMexDef();
	if (ai->utility->IsMetalMap())
	{
		ai->utility->Log(ALL, MISC, "FindClosestMetalExtractionSite on MetalMap");
		//If this is an all-metal map, we can safely fallback to use FindClosestNonConflictingBuildSite
		return FindClosestNonConflictingBuildSite(mexDef, pos, 1000, 0, 0);
		//return ai->callback->GetMap()->FindClosestBuildSite( *mexDef, pos, 1000, 0, 0);
	}
	
	vector<SAIFloat3> spots;
	Map *map = ai->callback->GetMap();
	spots = map->GetResourceMapSpotsPositions( *(ai->utility->GetResource("Metal")), &pos );
	
	int numSpots = spots.size();
	int lowestIdx = -1;
	float closest = 9999999.9f;

	for ( int i  = 0 ; i < numSpots ; i++ )
	{
		//u->ChatMsg( "Metal spot: x: %f y: %f z: %f", spots[i].x, spots[i].y, spots[i].z );
		double distance = ai->utility->EuclideanDistance( spots[i], pos );
		//u->ChatMsg( "Distance: %f", distance );

		if ( distance < closest
			&& map->IsPossibleToBuildAt( *(ai->utility->GetMexDef()), spots[i], 0 )
			 && (!checkIfItBlocks || !BuildBlocksSelf(mexDef, spots[i], 0)) )
		{
			closest = distance;
			lowestIdx = i;
		}
	}
	delete map;
	///TODO: What if we didn't find an accaptable spot? (lowestIdx=-1)
	if(lowestIdx == -1)
	{
		// we didnt find a spot
		return (SAIFloat3) {0,-1,0};
	}
	pos = spots[lowestIdx];
	
	return pos;

}