package ncrashed.warp.cores.actions;

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

import ncrashed.warp.IntVec3;
import ncrashed.warp.api.IWarpBeacon;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.world.World;

/**
 * Вытащил сюда алгоритмы поиска маркеров по игроку.
 * @author NCrashed
 *
 */
abstract public class BaseBeaconAction 
{
	public static class BeaconTemp
	{
		IntVec3 vec;
		EntityPlayerMP player;
		
		public BeaconTemp(IntVec3 vec, EntityPlayerMP player)
		{
			this.vec = vec;
			this.player = player;
		}
	}
	
	/**
	 * Получение списка маяков, заданных структурой beaconStr в мире world. Будут
	 * найдены только маяки, на которых в данных момент стоят игроки.
	 * @param world
	 * @param beaconStr
	 * @return
	 */
	public List<IntVec3> getBeaconList(World world, IWarpBeacon beaconStr)
	{
		ListIterator<EntityPlayer> iter = world.playerEntities.listIterator();
		List<IntVec3> list = new ArrayList<IntVec3>();
		
		while(iter.hasNext())
		{
			EntityPlayer player = iter.next();
			if(beaconStr.checkStructure(world, (int)Math.floor(player.posX), (int)Math.floor(player.posY), (int)Math.floor(player.posZ), beaconStr.getPlayerX(), beaconStr.getPlayerY(), beaconStr.getPlayerZ()))
			{
				list.add(new IntVec3((int)player.posX- beaconStr.getPlayerX(), 
						(int)player.posY- beaconStr.getPlayerY(),
						(int)player.posZ- beaconStr.getPlayerZ()
						));
			}
		}
		
		return list;
	}
	
	/**
	 * Аналогичная функция для получения списка маяков, на которых стоят игроки, только вернет с информацией
	 * о игроках.
	 * @param world
	 * @param beaconStr
	 * @return
	 */
	public List<BeaconTemp> getBeaconListWithPlayers(World world, IWarpBeacon beaconStr)
	{
		ListIterator<EntityPlayer> iter = world.playerEntities.listIterator();
		List<BeaconTemp> list = new ArrayList<BeaconTemp>();
		
		while(iter.hasNext())
		{
			EntityPlayerMP player = (EntityPlayerMP)iter.next();
			if(beaconStr.checkStructure(world, (int)Math.floor(player.posX), (int)Math.floor(player.posY), (int)Math.floor(player.posZ), beaconStr.getPlayerX(), beaconStr.getPlayerY(), beaconStr.getPlayerZ()))
			{
				list.add(new BeaconTemp(
						new IntVec3((int)Math.floor(player.posX)- beaconStr.getPlayerX(), 
								(int)Math.floor(player.posY) - beaconStr.getPlayerY(),
								(int)Math.floor(player.posZ)- beaconStr.getPlayerZ()),
								player));
			}
		}
		
		return list;
	}
}
