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

package com.hypixel.hytale.server.worldgen.container;

import javax.annotation.Nonnull;
import com.hypixel.hytale.math.util.MathUtil;
import com.hypixel.hytale.procedurallib.condition.ICoordinateCondition;
import com.hypixel.hytale.procedurallib.supplier.IDoubleCoordinateSupplier;

public class WaterContainer
{
    public static final int NO_WATER_AT_COORDINATED = Integer.MIN_VALUE;
    private final Entry[] entries;
    
    public static boolean isValidWaterHeight(final int height) {
        return height > 0;
    }
    
    public WaterContainer(final Entry[] entries) {
        this.entries = entries;
    }
    
    public boolean hasEntries() {
        return this.entries.length != 0;
    }
    
    public Entry[] getEntries() {
        return this.entries;
    }
    
    public int getMaxHeight(final int seed, final int x, final int z) {
        int totalMax = Integer.MIN_VALUE;
        for (final Entry entry : this.entries) {
            final int min = entry.getMin(seed, x, z);
            final int max = entry.getMax(seed, x, z);
            if (min <= max) {
                if (max > totalMax) {
                    totalMax = max;
                }
            }
        }
        if (totalMax < 0) {
            return Integer.MIN_VALUE;
        }
        return totalMax;
    }
    
    public static class Entry
    {
        public static final Entry[] EMPTY_ARRAY;
        private final int block;
        private final int fluid;
        private final IDoubleCoordinateSupplier min;
        private final IDoubleCoordinateSupplier max;
        private final ICoordinateCondition mask;
        
        public Entry(final int block, final int fluid, final IDoubleCoordinateSupplier min, final IDoubleCoordinateSupplier max, final ICoordinateCondition mask) {
            this.block = block;
            this.fluid = fluid;
            this.min = min;
            this.max = max;
            this.mask = mask;
        }
        
        public int getBlock() {
            return this.block;
        }
        
        public int getFluid() {
            return this.fluid;
        }
        
        public int getMax(final int seed, final int x, final int z) {
            return MathUtil.floor(this.max.get(seed, x, z));
        }
        
        public int getMin(final int seed, final int x, final int z) {
            return MathUtil.floor(this.min.get(seed, x, z));
        }
        
        public boolean shouldPopulate(final int seed, final int x, final int z) {
            return this.mask.eval(seed, x, z);
        }
        
        public IDoubleCoordinateSupplier getMax() {
            return this.max;
        }
        
        public IDoubleCoordinateSupplier getMin() {
            return this.min;
        }
        
        @Nonnull
        @Override
        public String toString() {
            return "Entry{, fluid=" + this.fluid + ", min=" + String.valueOf(this.min) + ", max=" + String.valueOf(this.max) + ", mask=" + String.valueOf(this.mask);
        }
        
        static {
            EMPTY_ARRAY = new Entry[0];
        }
    }
}
