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

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

import com.hypixel.hytale.server.worldgen.zoom.ExactZoom;
import com.hypixel.hytale.server.worldgen.zoom.PixelProvider;
import java.awt.image.BufferedImage;
import com.hypixel.hytale.procedurallib.random.CoordinateRandomizer;
import java.util.Map;
import java.util.List;
import com.hypixel.hytale.math.util.FastRandom;
import com.hypixel.hytale.server.worldgen.zone.Zone;
import com.hypixel.hytale.server.worldgen.chunk.ChunkGenerator;
import com.hypixel.hytale.math.util.MathUtil;
import javax.annotation.Nonnull;
import com.hypixel.hytale.procedurallib.random.ICoordinateRandomizer;
import com.hypixel.hytale.server.worldgen.zoom.FuzzyZoom;
import com.hypixel.hytale.server.worldgen.chunk.MaskProvider;

public class ClimateMaskProvider extends MaskProvider
{
    private static final FuzzyZoom EMPTY_ZOOM;
    @Nonnull
    private final ICoordinateRandomizer randomizer;
    @Nonnull
    private final ClimateNoise noise;
    @Nonnull
    private final ClimateGraph graph;
    @Nonnull
    private final UniqueClimateGenerator uniqueGenerator;
    
    public ClimateMaskProvider(@Nonnull final ICoordinateRandomizer randomizer, @Nonnull final ClimateNoise noise, @Nonnull final ClimateGraph graph, @Nonnull final UniqueClimateGenerator uniqueGenerator) {
        super(ClimateMaskProvider.EMPTY_ZOOM);
        this.randomizer = randomizer;
        this.noise = noise;
        this.graph = graph;
        this.uniqueGenerator = uniqueGenerator;
    }
    
    private ClimateMaskProvider(@Nonnull final ClimateMaskProvider other, @Nonnull final UniqueClimateGenerator uniqueGenerator) {
        super(ClimateMaskProvider.EMPTY_ZOOM);
        this.randomizer = other.randomizer;
        this.noise = other.noise;
        this.graph = other.graph;
        this.uniqueGenerator = uniqueGenerator;
    }
    
    @Nonnull
    public ClimateGraph getGraph() {
        return this.graph;
    }
    
    @Override
    public boolean inBounds(final double x, final double y) {
        return true;
    }
    
    @Override
    public double getX(final int seed, final double x, final double y) {
        return this.randomizer.randomDoubleX(seed, x, y);
    }
    
    @Override
    public double getY(final int seed, final double x, final double y) {
        return this.randomizer.randomDoubleY(seed, x, y);
    }
    
    @Override
    public int get(final int seed, final double x, final double y) {
        final int unique = this.uniqueGenerator.generate(MathUtil.floor(x), MathUtil.floor(y));
        if (unique != -1) {
            return unique;
        }
        final ClimateNoise.Buffer buffer = ChunkGenerator.getResource().climateBuffer;
        final int id = this.noise.generate(seed, x, y, buffer, this.graph);
        return ClimateType.color(id, this.graph);
    }
    
    @Override
    public double distance(final double x, final double y) {
        final ClimateNoise.Buffer buffer = ChunkGenerator.getResource().climateBuffer;
        return buffer.fade;
    }
    
    @Override
    public MaskProvider generateUniqueZones(final int seed, @Nonnull final Zone.UniqueCandidate[] candidates, @Nonnull final FastRandom random, @Nonnull final List<Zone.Unique> collector) {
        if (candidates.length == 0) {
            return this;
        }
        return new ClimateMaskProvider(this, this.uniqueGenerator.apply(seed, candidates, this.noise, this.graph, collector));
    }
    
    @Override
    public Zone.UniqueCandidate[] generateUniqueZoneCandidates(final Zone.UniqueEntry[] entries, final int maxPositions) {
        return Zone.UniqueCandidate.EMPTY_ARRAY;
    }
    
    public Zone.UniqueCandidate[] getUniqueZoneCandidates(final Map<String, Zone> zoneLookup) {
        return this.uniqueGenerator.getCandidates(zoneLookup);
    }
    
    static {
        EMPTY_ZOOM = new FuzzyZoom(CoordinateRandomizer.EMPTY_RANDOMIZER, new ExactZoom(new PixelProvider(new BufferedImage(1, 1, 1)), 1.0, 1.0, 0, 0));
    }
}
