package com.draco18s.artifacts.block;

import static net.minecraftforge.common.util.ForgeDirection.EAST;
import static net.minecraftforge.common.util.ForgeDirection.NORTH;
import static net.minecraftforge.common.util.ForgeDirection.SOUTH;
import static net.minecraftforge.common.util.ForgeDirection.WEST;
import com.draco18s.artifacts.DragonArtifacts;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.IIcon;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.util.Vec3;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;

public class BlockCoverPlate extends Block {
	public static Block instance;
	public int renderType = 0;

	public BlockCoverPlate() {
		super(Material.rock);
		setLightOpacity(0);
		setResistance(2F);
		setStepSound(Block.soundTypeStone);
		setHardness(0.5F);
        //setCreativeTab(CreativeTabs.tabBlock);
		setCreativeTab(DragonArtifacts.tabGeneral);
	}
	
	@Override
	public int getRenderType() {
		return renderType;
	}
	
	@Override
	public IIcon getIcon(int side, int metadata) {
		return blockIcon;
	}
	
	@Override
	public void registerBlockIcons(IIconRegister par1IconRegister) {
		blockIcon = par1IconRegister.registerIcon("artifacts:cover_hole");
	}
	
	@Override
	public boolean renderAsNormalBlock()
    {
        return false;
    }
	
	@Override
	public boolean isOpaqueCube()
    {
        return false;
    }
	
	@Override
	public boolean getBlocksMovement(IBlockAccess par1IBlockAccess, int par2, int par3, int par4)
    {
        return false;
    }

	@Override
	public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4)
    {
		return null;
    }
	
	@Override
	public void setBlockBoundsBasedOnState(IBlockAccess par1IBlockAccess, int par2, int par3, int par4)
    {
        int par1 = (par1IBlockAccess.getBlockMetadata(par2, par3, par4));
        float f = 0.125F;

        if (par1 == 2)
        {
            this.setBlockBounds(0.0F, -1F, 1.0F - f, 1.0F, 1.0F, 1.0F);
        }

        if (par1 == 3)
        {
            this.setBlockBounds(0.0F, -1F, 0.0F, 1.0F, 1.0F, f);
        }

        if (par1 == 4)
        {
            this.setBlockBounds(1.0F - f, -1F, 0.0F, 1.0F, 1.0F, 1.0F);
        }

        if (par1 == 5)
        {
            this.setBlockBounds(0.0F, -1F, 0.0F, f, 1.0F, 1.0F);
        }
    }
	
	@Override
	public boolean canPlaceBlockAt(World world, int x, int y, int z)
    {
        return world.getBlock(x - 1, y, z).isSideSolid(world, x - 1, y, z, EAST ) ||
               world.getBlock(x + 1, y, z).isSideSolid(world, x + 1, y, z, WEST ) ||
               world.getBlock(x, y, z - 1).isSideSolid(world, x, y, z - 1, SOUTH) ||
               world.getBlock(x, y, z + 1).isSideSolid(world, x, y, z + 1, NORTH);
    }
	
	@Override
	public int onBlockPlaced(World world, int x, int y, int z, int par5, float par6, float par7, float par8, int par9)
    {
        int j1 = par9;

        if ((j1 == 0 || par5 == 2) && world.getBlock(x, y, z + 1).isSideSolid(world, x, y, z + 1, NORTH))
        {
            j1 = 2;
        }

        if ((j1 == 0 || par5 == 3) && world.getBlock(x, y, z - 1).isSideSolid(world, x, y, z - 1, SOUTH))
        {
            j1 = 3;
        }

        if ((j1 == 0 || par5 == 4) && world.getBlock(x + 1, y, z).isSideSolid(world, x + 1, y, z, WEST))
        {
            j1 = 4;
        }

        if ((j1 == 0 || par5 == 5) && world.getBlock(x - 1, y, z).isSideSolid(world, x - 1, y, z, EAST))
        {
            j1 = 5;
        }

        return j1;
    }

	@Override
    public void onNeighborBlockChange(World world, int x, int y, int z, Block block)
    {
        int i1 = world.getBlockMetadata(x, y, z);
        boolean flag = false;

        if (i1 == 2 && world.getBlock(x, y, z + 1).isSideSolid(world, x, y, z + 1, NORTH))
        {
            flag = true;
        }

        if (i1 == 3 && world.getBlock(x, y, z - 1).isSideSolid(world, x, y, z - 1, SOUTH))
        {
            flag = true;
        }

        if (i1 == 4 && world.getBlock(x + 1, y, z).isSideSolid(world, x + 1, y, z, WEST))
        {
            flag = true;
        }

        if (i1 == 5 && world.getBlock(x - 1, y, z).isSideSolid(world, x - 1, y, z, EAST))
        {
            flag = true;
        }

        if (!flag)
        {
            this.dropBlockAsItem(world, x, y, z, i1, 0);
            world.setBlockToAir(x, y, z);
        }

        super.onNeighborBlockChange(world, x, y, z, block);
    }
    
	@Override
    public int getRenderBlockPass()
    {
        return 1;
    }
    
	@Override
    public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side)
    {
		int l = world.getBlockMetadata(x, y, z);
		switch(l) {
	        case 2:
	        	z++;
	        	break;
	        case 3:
	        	z--;
	        	break;
	        case 4:
	        	x++;
	        	break;
	        case 5:
	        	x--;
	        	break;
	    }
		switch(side) {
	        case 2:
	        	z++;
	        	break;
	        case 3:
	        	z--;
	        	break;
	        case 4:
	        	x++;
	        	break;
	        case 5:
	        	x--;
	        	break;
	    }
	    y--;
	    boolean solid = world.getBlock(x, y, z).isOpaqueCube();
	    if(side == 0 || side == 1)
	    	solid = true;
        return !solid;
    }
}