package cn.mcmod.sakura.block;

import java.util.Random;

import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty;
import net.minecraft.block.properties.PropertyBool;
import net.minecraft.block.state.BlockFaceShape;
import net.minecraft.block.state.BlockStateContainer;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.util.BlockRenderLayer;
import net.minecraft.util.EnumBlockRenderType;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

public class BlockKitunebi extends Block {
	public static final PropertyBool ISVISIBLE = PropertyBool.create("isvisible");
	
	public BlockKitunebi() {
		super(Material.WOOD);
        setTickRandomly(true);
        setHardness(0.0F);
        setLightLevel(1F);
        setDefaultState(this.blockState.getBaseState().withProperty(ISVISIBLE, false));
	}

	@Override
	public boolean isOpaqueCube(IBlockState state) {
		return false;
	}
	@Override
	public EnumBlockRenderType getRenderType(IBlockState state) {
		return EnumBlockRenderType.MODEL;
	}
    @Override
    public BlockFaceShape getBlockFaceShape(IBlockAccess worldIn, IBlockState state, BlockPos pos, EnumFacing face) {
        return BlockFaceShape.UNDEFINED;
    }

    @Override
    public boolean isFullCube(IBlockState state)
    {
        return false;
    }

    @SideOnly(Side.CLIENT)
    public BlockRenderLayer getBlockLayer() {
        return BlockRenderLayer.CUTOUT_MIPPED;
    }

    @Override
    public AxisAlignedBB getCollisionBoundingBox(IBlockState blockState, IBlockAccess worldIn, BlockPos pos) {
    	return Block.NULL_AABB;
    }
    
    @Override
    public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) {
    	return state.getValue(ISVISIBLE)?Block.FULL_BLOCK_AABB:new AxisAlignedBB(0, 0, 0, 0, 0, 0);
    }

    @Override
    protected BlockStateContainer createBlockState() {
    	return new BlockStateContainer(this,  new IProperty[] {ISVISIBLE});
    }
    
    @Override
    public void randomDisplayTick(IBlockState stateIn, World worldIn, BlockPos pos, Random rand) {
    	setVisibleFlg(worldIn, pos, stateIn);
    }
    
    private void setVisibleFlg(World world, BlockPos pos,IBlockState state) {
        world.setBlockState(pos, state.withProperty(ISVISIBLE, false));
    	EntityPlayer player = world.getClosestPlayer(pos.getX() + 0.5F, pos.getY() + 0.5F, pos.getZ() + 0.5F, 5.0D, false);
    	if(player ==null){
    		world.setBlockState(pos, state.withProperty(ISVISIBLE, false));
    		return;
    	}
        ItemStack is = player.getHeldItemMainhand();
        ItemStack offis =player.getHeldItemOffhand();
        if (!is.isEmpty()||!offis.isEmpty()) {
        	Item mainItem = is.getItem(),offItem=offis.getItem();
            if (mainItem instanceof ItemBlock||offItem instanceof ItemBlock) {
                if (Block.getBlockFromItem(mainItem) == this||Block.getBlockFromItem(offItem) == this) {
                    world.setBlockState(pos, state.withProperty(ISVISIBLE, true));
                }
            }
        }
    }
    /**
     * Convert the given metadata into a BlockState for this Block
     */
    public IBlockState getStateFromMeta(int meta)
    {
        return this.getDefaultState().withProperty(ISVISIBLE, meta>0?true:false);
    }

    /**
     * Convert the BlockState into the correct metadata value
     */
    public int getMetaFromState(IBlockState state)
    {
        return state.getValue(ISVISIBLE)?1:0;
    }
}