// 
// Decompiled by Procyon v0.6.0
// 

package com.hypixel.hytale.builtin.hytalegenerator.material;

import java.util.Objects;
import javax.annotation.Nonnull;

public final class Material
{
    @Nonnull
    private final SolidMaterial solid;
    @Nonnull
    private final FluidMaterial fluid;
    private Hash hashCode;
    private Hash materialIdsHash;
    
    public Material(@Nonnull final SolidMaterial solid, @Nonnull final FluidMaterial fluid) {
        this.solid = solid;
        this.fluid = fluid;
        this.hashCode = new Hash();
        this.materialIdsHash = new Hash();
    }
    
    @Override
    public boolean equals(final Object o) {
        if (o instanceof final Material material) {
            return Objects.equals(this.solid, material.solid) && Objects.equals(this.fluid, material.fluid);
        }
        return false;
    }
    
    @Override
    public int hashCode() {
        if (this.hashCode.isCalculated) {
            return this.hashCode.value;
        }
        this.hashCode.value = hashCode(this.solid, this.fluid);
        this.hashCode.isCalculated = true;
        return this.hashCode.value;
    }
    
    public int hashMaterialIds() {
        if (this.materialIdsHash.isCalculated) {
            return this.materialIdsHash.value;
        }
        this.materialIdsHash.value = hashMaterialIds(this.solid, this.fluid);
        this.materialIdsHash.isCalculated = true;
        return this.materialIdsHash.value;
    }
    
    public static int hashCode(@Nonnull final SolidMaterial solid, @Nonnull final FluidMaterial fluid) {
        int result = solid.hashCode();
        result = 31 * result + fluid.hashCode();
        return result;
    }
    
    public static int hashMaterialIds(@Nonnull final SolidMaterial solid, @Nonnull final FluidMaterial fluid) {
        return Objects.hash(solid.blockId, fluid.fluidId);
    }
    
    public SolidMaterial solid() {
        return this.solid;
    }
    
    public FluidMaterial fluid() {
        return this.fluid;
    }
    
    @Override
    public String toString() {
        return "Material[solid=" + String.valueOf(this.solid) + ", fluid=" + String.valueOf(this.fluid);
    }
    
    private class Hash
    {
        int value;
        boolean isCalculated;
        
        private Hash(final Material material) {
            this.value = 0;
            this.isCalculated = false;
        }
    }
}
