package ncrashed.warp.api;

import java.util.Map;
import java.util.List;

import net.minecraft.world.World;

public interface IBigStructure 
{
	public static class BlockInfo
	{
		public int id;
		public int meta;
		
		public BlockInfo(int id, int meta)
		{
			this.id = id;
			this.meta = meta;
		}
	}
	
	/**
	 * Дополнительный делегат, который проверяет соответствие блока заявляенному рецепту.
	 * @author NCrashed
	 *
	 */
	public static interface IConditionHandler
	{
		boolean isValidBlock(World world, int x, int y, int z, int recipeId);
	}
	
	/**
	 * Устанавливает соответствие id блоков и внутренного рецепта строительства.
	 * @param blockMap
	 */
	public void addBlockMapping(Map<Integer, List<BlockInfo> > blockMap);
	
	/**
	 * Добавление слоя layer в рецепт, обязаны все иметь один и тот же размер NxM, который
	 * определяется первым слоем. Можно использовать -1, обозначающий любой блок.
	 * @param layer
	 */
	public void addLayer(int[][] layer);
	
	/**
	 * Добавляет условие для успешной валидации конструкции на конкретный id в рецепте.
	 * @param recipeId
	 * @param handler
	 */
	public void addCondition(int recipeId, IConditionHandler handler);
	
	/**
	 * Получение габаритов постройки после задания слоев.
	 * @return
	 */
	public int getStructureX();
	
	/**
	 * Получение габаритов постройки после задания слоев.
	 * @return
	 */
	public int getStructureZ();
	
	/**
	 * Получение габаритов постройки после задания слоев.
	 * @return
	 */
	public int getStructureY();
	
	/**
	 * Проверяет на соответствие рецепту кусок мира по координатам (x,y,z), со смещением
	 * в рецепте на (ox, oy, oz). При нулевом смещении это будет левый верхний угол первого слоя.
	 * @param world
	 * @param x
	 * @param y
	 * @param z
	 * @param ox
	 * @param oy
	 * @param oz
	 * @return
	 */
	public boolean checkStructure(World world, int x, int y, int z, int ox, int oy, int oz);
}
