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

package com.hypixel.hytale.server.worldgen.loader.biome;

import javax.annotation.Nullable;
import com.hypixel.hytale.procedurallib.logic.cell.PointDistanceFunction;
import com.hypixel.hytale.procedurallib.json.PointGeneratorJsonLoader;
import com.hypixel.hytale.procedurallib.logic.point.IPointGenerator;
import com.google.gson.JsonElement;
import java.nio.file.Path;
import javax.annotation.Nonnull;
import com.hypixel.hytale.procedurallib.json.SeedString;
import com.hypixel.hytale.server.worldgen.biome.CustomBiome;
import com.hypixel.hytale.server.worldgen.biome.TileBiome;
import com.hypixel.hytale.common.map.IWeightedMap;
import com.hypixel.hytale.server.worldgen.biome.BiomePatternGenerator;
import com.hypixel.hytale.server.worldgen.SeedStringResource;
import com.hypixel.hytale.procedurallib.json.JsonLoader;

public class BiomePatternGeneratorJsonLoader extends JsonLoader<SeedStringResource, BiomePatternGenerator>
{
    protected final IWeightedMap<TileBiome> tileBiomes;
    protected final CustomBiome[] customBiomes;
    
    public BiomePatternGeneratorJsonLoader(@Nonnull final SeedString<SeedStringResource> seed, final Path dataFolder, final JsonElement json, final IWeightedMap<TileBiome> tileBiomes, final CustomBiome[] customBiomes) {
        super(seed.append(".BiomePatternGenerator"), dataFolder, json);
        this.tileBiomes = tileBiomes;
        this.customBiomes = customBiomes;
    }
    
    @Nonnull
    @Override
    public BiomePatternGenerator load() {
        final BiomePatternGeneratorSizeModifierProvider sizeModifierProvider = new BiomePatternGeneratorSizeModifierProvider();
        final BiomePatternGenerator biomePatternGenerator = new BiomePatternGenerator(this.loadPointGenerator(sizeModifierProvider), this.tileBiomes, this.customBiomes);
        sizeModifierProvider.setGenerator(biomePatternGenerator);
        return biomePatternGenerator;
    }
    
    @Nullable
    protected IPointGenerator loadPointGenerator(final ISizeModifierProvider sizeModifierProvider) {
        return new PointGeneratorJsonLoader<SeedStringResource>(this, this.seed, this.dataFolder, this.get("GridGenerator")) {
            @Nonnull
            @Override
            protected PointDistanceFunction loadPointDistanceFunction() {
                final PointDistanceFunction distanceFunction = super.loadPointDistanceFunction();
                return new LoadedPointGeneratorDistanceFunction(sizeModifierProvider, distanceFunction);
            }
        }.load();
    }
    
    private static class LoadedPointGeneratorDistanceFunction implements PointDistanceFunction
    {
        private final ISizeModifierProvider sizeModifierProvider;
        private final PointDistanceFunction distanceFunction;
        
        public LoadedPointGeneratorDistanceFunction(final ISizeModifierProvider sizeModifierProvider, final PointDistanceFunction distanceFunction) {
            this.sizeModifierProvider = sizeModifierProvider;
            this.distanceFunction = distanceFunction;
        }
        
        @Override
        public double distance2D(final double deltaX, final double deltaY) {
            return this.distanceFunction.distance2D(deltaX, deltaY);
        }
        
        @Override
        public double distance3D(final double deltaX, final double deltaY, final double deltaZ) {
            return this.distanceFunction.distance3D(deltaX, deltaY, deltaZ);
        }
        
        @Override
        public double distance2D(final int seed, final int cellX, final int cellY, final double cellCentreX, final double cellCentreY, final double deltaX, final double deltaY) {
            return this.distanceFunction.distance2D(seed, cellX, cellY, cellCentreX, cellCentreY, deltaX, deltaY) * this.sizeModifierProvider.get(seed, cellX, cellY);
        }
        
        @Override
        public double distance3D(final int seed, final int cellX, final int cellY, final int cellZ, final double cellCentreX, final double cellCentreY, final double cellCentreZ, final double deltaX, final double deltaY, final double deltaZ) {
            return this.distanceFunction.distance3D(seed, cellX, cellY, cellZ, cellCentreX, cellCentreY, cellCentreZ, deltaX, deltaY, deltaZ);
        }
    }
    
    protected static class BiomePatternGeneratorSizeModifierProvider implements ISizeModifierProvider
    {
        private BiomePatternGenerator generator;
        
        public BiomePatternGeneratorSizeModifierProvider() {
        }
        
        public BiomePatternGeneratorSizeModifierProvider(final BiomePatternGenerator generator) {
            this.generator = generator;
        }
        
        public BiomePatternGenerator getGenerator() {
            return this.generator;
        }
        
        public void setGenerator(final BiomePatternGenerator generator) {
            this.generator = generator;
        }
        
        @Override
        public double get(final int seed, final int x, final int y) {
            return this.generator.getBiomeDirect(seed, x, y).getSizeModifier();
        }
    }
    
    public interface Constants
    {
        public static final String KEY_GRID_GENERATOR = "GridGenerator";
    }
    
    public interface ISizeModifierProvider
    {
        double get(final int p0, final int p1, final int p2);
    }
}
