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

package com.hypixel.hytale.procedurallib.json;

import com.google.gson.JsonElement;
import java.nio.file.Path;
import com.hypixel.hytale.procedurallib.NoiseFunction;
import javax.annotation.Nonnull;
import java.lang.reflect.Constructor;
import com.hypixel.hytale.procedurallib.NoiseType;

public enum NoiseTypeJson
{
    CELL(NoiseType.CELL, (Class<T>)CellNoiseJsonLoader.class), 
    CONSTANT(NoiseType.CONSTANT, (Class<T>)ConstantNoiseJsonLoader.class), 
    DISTANCE(NoiseType.DISTANCE, (Class<T>)DistanceNoiseJsonLoader.class), 
    PERLIN(NoiseType.PERLIN, (Class<T>)PerlinNoiseJsonLoader.class), 
    SIMPLEX(NoiseType.SIMPLEX, (Class<T>)SimplexNoiseJsonLoader.class), 
    OLD_SIMPLEX(NoiseType.OLD_SIMPLEX, (Class<T>)OldSimplexNoiseJsonLoader.class), 
    VALUE(NoiseType.VALUE, (Class<T>)ValueNoiseJsonLoader.class), 
    MESH(NoiseType.MESH, (Class<T>)MeshNoiseJsonLoader.class), 
    GRID(NoiseType.GRID, (Class<T>)GridNoiseJsonLoader.class), 
    BRANCH(NoiseType.BRANCH, (Class<T>)BranchNoiseJsonLoader.class), 
    POINT(NoiseType.POINT, (Class<T>)PointNoiseJsonLoader.class);
    
    private final NoiseType noiseType;
    @Nonnull
    private final Constructor constructor;
    
    private <T extends JsonLoader<?, NoiseFunction>> NoiseTypeJson(final NoiseType noiseType, final Class<T> loaderClass) {
        this.noiseType = noiseType;
        try {
            (this.constructor = loaderClass.getConstructor(SeedString.class, Path.class, JsonElement.class)).setAccessible(true);
        }
        catch (final NoSuchMethodException e) {
            throw new Error(String.format("Could not find loader constructor for %s. NoiseType: %s", loaderClass.getName(), noiseType), e);
        }
    }
    
    @Nonnull
    public <K extends SeedResource> JsonLoader<K, NoiseFunction> newLoader(final SeedString<K> seed, final Path dataFolder, final JsonElement json) {
        try {
            return this.constructor.newInstance(seed, dataFolder, json);
        }
        catch (final Exception e) {
            throw new Error(String.format("Failed to execute loader constructor! NoiseType: %s", this.noiseType), e);
        }
    }
    
    public interface Constants
    {
        public static final String ERROR_NO_CONSTRUCTOR = "Could not find loader constructor for %s. NoiseType: %s";
        public static final String ERROR_FAILED_CONSTRUCTOR = "Failed to execute loader constructor! NoiseType: %s";
    }
}
