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

package com.hypixel.hytale.procedurallib.property;

import javax.annotation.Nonnull;

public class NoiseFormulaProperty implements NoiseProperty
{
    protected final NoiseProperty property;
    protected final NoiseFormula.Formula formula;
    
    public NoiseFormulaProperty(final NoiseProperty property, final NoiseFormula.Formula formula) {
        this.property = property;
        this.formula = formula;
    }
    
    public NoiseProperty getProperty() {
        return this.property;
    }
    
    public NoiseFormula.Formula getFormula() {
        return this.formula;
    }
    
    @Override
    public double get(final int seed, final double x, final double y) {
        return this.formula.eval(this.property.get(seed, x, y));
    }
    
    @Override
    public double get(final int seed, final double x, final double y, final double z) {
        return this.formula.eval(this.property.get(seed, x, y, z));
    }
    
    @Nonnull
    @Override
    public String toString() {
        return "NoiseFormulaProperty{property=" + String.valueOf(this.property) + ", formula=" + String.valueOf(this.formula);
    }
    
    public enum NoiseFormula
    {
        NORMAL((Formula)new Formula() {
            @Override
            public double eval(final double noise) {
                return noise;
            }
            
            @Nonnull
            @Override
            public String toString() {
                return "NormalFormula{}";
            }
        }), 
        INVERTED((Formula)new Formula() {
            @Override
            public double eval(final double noise) {
                return 1.0 - noise;
            }
            
            @Nonnull
            @Override
            public String toString() {
                return "InvertedFormula{}";
            }
        }), 
        SQUARED((Formula)new Formula() {
            @Override
            public double eval(final double noise) {
                return noise * noise;
            }
            
            @Nonnull
            @Override
            public String toString() {
                return "SquaredFormula{}";
            }
        }), 
        INVERTED_SQUARED((Formula)new Formula() {
            @Override
            public double eval(final double noise) {
                return 1.0 - noise * noise;
            }
            
            @Nonnull
            @Override
            public String toString() {
                return "InvertedSquaredFormula{}";
            }
        }), 
        SQRT((Formula)new Formula() {
            @Override
            public double eval(final double noise) {
                return Math.sqrt(noise);
            }
            
            @Nonnull
            @Override
            public String toString() {
                return "SqrtFormula{}";
            }
        }), 
        INVERTED_SQRT((Formula)new Formula() {
            @Override
            public double eval(final double noise) {
                return 1.0 - Math.sqrt(noise);
            }
            
            @Nonnull
            @Override
            public String toString() {
                return "InvertedSqrtFormula{}";
            }
        }), 
        RIDGED((Formula)new Formula() {
            @Override
            public double eval(final double noise) {
                return Math.abs(noise - 0.5);
            }
            
            @Nonnull
            @Override
            public String toString() {
                return "RidgedFormula{}";
            }
        }), 
        INVERTED_RIDGED((Formula)new Formula() {
            @Override
            public double eval(final double noise) {
                return 1.0 - Math.abs(noise - 0.5);
            }
            
            @Nonnull
            @Override
            public String toString() {
                return "InvertedRidgedFormula{}";
            }
        }), 
        RIDGED_SQRT((Formula)new Formula() {
            @Override
            public double eval(final double noise) {
                return Math.sqrt(Math.abs(noise - 0.5));
            }
            
            @Nonnull
            @Override
            public String toString() {
                return "RidgedSqrtFormula{}";
            }
        }), 
        INVERTED_RIDGED_SQRT((Formula)new Formula() {
            @Override
            public double eval(final double noise) {
                return 1.0 - Math.sqrt(Math.abs(noise - 0.5));
            }
            
            @Nonnull
            @Override
            public String toString() {
                return "InvertedRidgedSqrtFormula{}";
            }
        }), 
        RIDGED_FIX((Formula)new Formula() {
            @Override
            public double eval(final double noise) {
                return Math.abs(noise * 2.0 - 1.0);
            }
            
            @Nonnull
            @Override
            public String toString() {
                return "RidgedFixFormula{}";
            }
        }), 
        INVERTED_RIDGED_FIX((Formula)new Formula() {
            @Override
            public double eval(final double noise) {
                return 1.0 - Math.abs(noise * 2.0 - 1.0);
            }
            
            @Nonnull
            @Override
            public String toString() {
                return "InvertedRidgedFixFormula{}";
            }
        }), 
        RIDGED_SQRT_FIX((Formula)new Formula() {
            @Override
            public double eval(final double noise) {
                return Math.sqrt(Math.abs(noise * 2.0 - 1.0));
            }
            
            @Nonnull
            @Override
            public String toString() {
                return "RidgedSqrtFixFormula{}";
            }
        }), 
        INVERTED_RIDGED_SQRT_FIX((Formula)new Formula() {
            @Override
            public double eval(final double noise) {
                return 1.0 - Math.sqrt(Math.abs(noise * 2.0 - 1.0));
            }
            
            @Nonnull
            @Override
            public String toString() {
                return "InvertedRidgedSqrtFixFormula{}";
            }
        }), 
        RIDGED_SQUARED_FIX((Formula)new Formula() {
            @Override
            public double eval(double noise) {
                noise = Math.abs(noise * 2.0 - 1.0);
                return noise * noise;
            }
            
            @Nonnull
            @Override
            public String toString() {
                return "RidgedSquaredFixFormula{}";
            }
        }), 
        INVERTED_RIDGED_SQUARED_FIX((Formula)new Formula() {
            @Override
            public double eval(double noise) {
                noise = Math.abs(noise * 2.0 - 1.0);
                return 1.0 - noise * noise;
            }
            
            @Nonnull
            @Override
            public String toString() {
                return "InvertedRidgedSquaredFixFormula{}";
            }
        });
        
        public final Formula formula;
        
        private NoiseFormula(final Formula formula) {
            this.formula = formula;
        }
        
        public Formula getFormula() {
            return this.formula;
        }
        
        @FunctionalInterface
        public interface Formula
        {
            double eval(final double p0);
        }
    }
}
