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

package com.hypixel.hytale.builtin.hytalegenerator.framework.shaders;

import javax.annotation.Nonnull;
import com.hypixel.hytale.builtin.hytalegenerator.framework.math.SeedGenerator;
import java.util.function.Predicate;

public class MaskShader<T> implements Shader<T>
{
    private final Shader<T> childShader;
    private final Predicate<T> mask;
    private SeedGenerator seedGenerator;
    
    private MaskShader(final Predicate<T> mask, final Shader<T> childShader, final long seed) {
        this.mask = mask;
        this.childShader = childShader;
        this.seedGenerator = new SeedGenerator(seed);
    }
    
    @Nonnull
    public static <T> Builder<T> builder(@Nonnull final Class<T> dataType) {
        return new Builder<T>();
    }
    
    @Override
    public T shade(final T current, final long seed) {
        if (!this.mask.test(current)) {
            return current;
        }
        return this.childShader.shade(current, seed);
    }
    
    @Override
    public T shade(final T current, final long seedA, final long seedB) {
        return this.shade(current, 0L);
    }
    
    @Override
    public T shade(final T current, final long seedA, final long seedB, final long seedC) {
        return this.shade(current, 0L);
    }
    
    @Nonnull
    @Override
    public String toString() {
        return "MaskShader{childShader=" + String.valueOf(this.childShader) + ", mask=" + String.valueOf(this.mask) + ", seedGenerator=" + String.valueOf(this.seedGenerator);
    }
    
    public static class Builder<T>
    {
        private Shader<T> childShader;
        private Predicate<T> mask;
        private long seed;
        
        private Builder() {
            this.seed = System.nanoTime();
        }
        
        @Nonnull
        public MaskShader<T> build() {
            if (this.childShader == null || this.mask == null) {
                throw new IllegalStateException("incomplete builder");
            }
            return new MaskShader<T>(this.mask, this.childShader, this.seed);
        }
        
        @Nonnull
        public Builder<T> withSeed(final long seed) {
            this.seed = seed;
            return this;
        }
        
        @Nonnull
        public Builder<T> withMask(@Nonnull final Predicate<T> mask) {
            this.mask = mask;
            return this;
        }
        
        @Nonnull
        public Builder<T> withChildShader(@Nonnull final Shader<T> shader) {
            this.childShader = shader;
            return this;
        }
    }
}
