package net.minecraft.block.state.pattern;

import com.google.common.base.Predicate;
import com.google.common.collect.Maps;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import net.minecraft.block.Block;
import net.minecraft.block.properties.IProperty;
import net.minecraft.block.state.BlockState;
import net.minecraft.block.state.IBlockState;

public class BlockStateHelper implements Predicate
{
    private final BlockState field_177641_a;
    private final Map field_177640_b = Maps.newHashMap();
    private static final String __OBFID = "CL_00002019";

    private BlockStateHelper(BlockState p_i45653_1_)
    {
        this.field_177641_a = p_i45653_1_;
    }

    public static BlockStateHelper forBlock(Block p_177638_0_)
    {
        return new BlockStateHelper(p_177638_0_.getBlockState());
    }

    public boolean func_177639_a(IBlockState p_177639_1_)
    {
        if (p_177639_1_ != null && p_177639_1_.getBlock().equals(this.field_177641_a.getBlock()))
        {
            Iterator iterator = this.field_177640_b.entrySet().iterator();
            Entry entry;
            Comparable comparable;

            do
            {
                if (!iterator.hasNext())
                {
                    return true;
                }

                entry = (Entry)iterator.next();
                comparable = p_177639_1_.getValue((IProperty)entry.getKey());
            }
            while (((Predicate)entry.getValue()).apply(comparable));

            return false;
        }
        else
        {
            return false;
        }
    }

    public BlockStateHelper func_177637_a(IProperty p_177637_1_, Predicate p_177637_2_)
    {
        if (!this.field_177641_a.getProperties().contains(p_177637_1_))
        {
            throw new IllegalArgumentException(this.field_177641_a + " cannot support property " + p_177637_1_);
        }
        else
        {
            this.field_177640_b.put(p_177637_1_, p_177637_2_);
            return this;
        }
    }

    public boolean apply(Object p_apply_1_)
    {
        return this.func_177639_a((IBlockState)p_apply_1_);
    }
}