package com.mcmoddev.communitymod.blockyentities;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraft.init.Blocks;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.EnumSkyBlock;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraft.world.WorldType;
import net.minecraft.world.biome.Biome;
import net.minecraft.world.chunk.IChunkProvider;

public class ShipStorage extends World implements IBlockAccess {

	public Map<BlockPos, BlockStorage> blockMap;
	private List<TileEntity> tesrs;
	private BlockPos offset;

	public BufferBuilder.State bufferstate;
	public boolean updateRequired = false;
	public World host;

	public ShipStorage(BlockPos bp, World hostWorld) {
		super(hostWorld.getSaveHandler(), hostWorld.getWorldInfo(), hostWorld.provider, hostWorld.profiler,
				hostWorld.isRemote);
		blockMap = new HashMap<BlockPos, BlockStorage>();
		offset = bp;
		tesrs = new ArrayList<TileEntity>();
		host = hostWorld;
	}

	@Override
	public TileEntity getTileEntity(BlockPos pos) {
		return blockMap.get(pos).tileentity;
	}

	@Override
	public int getCombinedLight(BlockPos pos, int lightValue) {
		int sky = getLightSet(EnumSkyBlock.SKY, pos);
		int map = getLightSet(EnumSkyBlock.BLOCK, pos);

		return sky << 20 | map << 4;
	}

	public int getLightSet(EnumSkyBlock type, BlockPos pos) {
		if (type == EnumSkyBlock.SKY) {
			return 15;
		} else if (blockMap.get(pos) != null) {
			return blockMap.get(pos).light;
		} else {
			return 0;
		}
	}

	@Override
	public IBlockState getBlockState(BlockPos pos) {
		if (blockMap.containsKey(pos)) {
			return blockMap.get(pos.add(offset)).blockstate;
		} else {
			return Blocks.AIR.getDefaultState();
		}
	}

	@Override
	public boolean isAirBlock(BlockPos pos) {
		return blockMap.get(pos).blockstate.getMaterial() == Material.AIR;
	}

	@Override
	public Biome getBiome(BlockPos pos) {
		return Biome.getBiome(0);
	}

	@Override
	public int getStrongPower(BlockPos pos, EnumFacing direction) {
		return 0;
	}

	@Override
	public WorldType getWorldType() {
		return WorldType.DEFAULT;
	}

	@Override
	public boolean isSideSolid(BlockPos pos, EnumFacing side, boolean _default) {
		if (!blockMap.containsKey(pos))
			return _default;
		return blockMap.get(pos).blockstate.isSideSolid(this, pos, side);
	}

	public List<TileEntity> getTESRs() {
		return tesrs;
	}

	public void setTESRs() {
		tesrs.clear();
		for (BlockStorage bs : blockMap.values()) {
			if (bs.tileentity != null) {
				@SuppressWarnings("rawtypes")
				TileEntitySpecialRenderer renderer = TileEntityRendererDispatcher.instance.renderers
						.get(bs.tileentity.getClass());
				if (renderer != null)
					tesrs.add(bs.tileentity);
			}
		}
	}

	@Override
	protected IChunkProvider createChunkProvider() {
		return host.getChunkProvider();
	}

	@Override
	protected boolean isChunkLoaded(int x, int z, boolean allowEmpty) {
		return true;
	}

}