package ncrashed.warp.api.volume;

import java.util.List;

import ncrashed.warp.IntVec3;
import ncrashed.warp.api.IWarpCore;
import net.minecraft.entity.Entity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.world.World;

/**
 * Интерфейс, описывающий замкнутое пространство для прыгов.
 * @author NCrashed
 *
 */
public interface IVolume 
{
	public static final int MAX_VOLUME_SIZE = 126;
	public static final int MAX_MARKER_DIST = 90;
	
	/**
	 * Проверят, находится ли точка (x,y,z) в замкнутом объеме, описанном маркерами.
	 * @param world
	 * @param x
	 * @param y
	 * @param z
	 * @param maxsize - максимальный размер объема по каждой из осей от точки (x,y,z).
	 * @return
	 */
	public boolean isValidVolume(World world, int ox, int oy, int oz, int maxsize, int minsx, int minsy, int minsz);
	
	/**
	 * Запоминает объем, в котором находится точка (x,y,z). Если объем не замкнут, ничего не делает и вернет false.
	 * Точка (x,y,z) становится началом отсчета и все коориданты считаются от нее.
	 * @param world
	 * @param x
	 * @param y
	 * @param z
	 * @param maxsize - максимальный размер объема по каждой из осей от точки (x,y,z).
	 */
	//public boolean setupVolume(World world, int x, int y, int z, int maxsize);
	
	/**
	 * Попытка добавить в границы объема маркер, находящийся в точке (x,y,z).
	 * @param world
	 * @param x
	 * @param y
	 * @param z
	 * @return
	 */
	public boolean addMarker(World world, int x, int y, int z, int ox, int oy, int oz);
	
	/**
	 * Попытка убрать маркер из описания объема.
	 * @param world
	 * @param x
	 * @param y
	 * @param z
	 * @param ox
	 * @param oy
	 * @param oz
	 * @return
	 */
	public boolean removeMarker(World world, int x, int y, int z, int ox, int oy, int oz);
	
	/**
	 * Загрузка объема из набора маркеров.
	 * @param markerList
	 * @return
	 */
	public boolean setupVolume(List<IntVec3> markerList);
	
	/**
	 * Если был хотя бы один успешный вызов setupVolume, должна вернуть true.
	 * @return
	 */
	public boolean isVolumeSetuped();
	
	/**
	 * Разбить объем на боксы и вернуть их.
	 * @return
	 */
	public List<AxisAlignedBB> getBoxes(int ox, int oy, int oz);
	
	/**
	 * Вернуть окамляющуу коробку для объема, полезно для рассчитывания габаритов корабля.
	 * @param ox
	 * @param oy
	 * @param oz
	 * @return
	 */
	public AxisAlignedBB getBoundingBox(int ox, int oy, int oz);
	
	/**
	 * Получить список маркеров.
	 * @return
	 */
	public List<IntVec3> getMarkers();
	
	/**
	 * Проверяет, находится для энтити внутри объема.
	 * @return
	 */
	public boolean isEntityInside(World world, int ox, int oy, int oz, Entity ent);
	
	/**
	 * Получение списка всех ядер внутри объема, исключая того, что находится в (ox, oy, oz). 
	 * @param world
	 * @param ox
	 * @param oy
	 * @param oz
	 * @param ent
	 * @return
	 */
	public List<IWarpCore> getAnotherCores(World world, int ox, int oy, int oz);
}
