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

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

import com.hypixel.hytale.server.worldgen.biome.Biome;
import javax.annotation.Nonnull;
import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;
import com.hypixel.hytale.math.util.FastRandom;
import com.hypixel.hytale.server.worldgen.chunk.MaskProvider;
import com.hypixel.hytale.procedurallib.logic.point.IPointGenerator;

public class ZonePatternProvider
{
    protected final IPointGenerator pointGenerator;
    protected final Zone[] zones;
    protected final Zone.UniqueCandidate[] uniqueZones;
    protected final MaskProvider maskProvider;
    protected final ZoneColorMapping zoneColorMapping;
    protected final int maxExtent;
    
    public ZonePatternProvider(final IPointGenerator pointGenerator, final Zone[] zones, final Zone.UniqueCandidate[] uniqueZones, final MaskProvider maskProvider, final ZoneColorMapping zoneColorMapping) {
        this.pointGenerator = pointGenerator;
        this.zones = zones;
        this.uniqueZones = uniqueZones;
        this.maskProvider = maskProvider;
        this.zoneColorMapping = zoneColorMapping;
        this.maxExtent = getMaxExtent(zones);
        for (final Zone.UniqueCandidate uniqueZone : uniqueZones) {
            zoneColorMapping.add(uniqueZone.zone().color(), uniqueZone.zone().zone());
        }
    }
    
    public int getMaxExtent() {
        return this.maxExtent;
    }
    
    public Zone[] getZones() {
        return this.zones;
    }
    
    public MaskProvider getMaskProvider() {
        return this.maskProvider;
    }
    
    public ZonePatternGenerator createGenerator(final int seed) {
        final FastRandom random = new FastRandom(seed);
        final ArrayList<Zone.Unique> uniqueZones = new ArrayList<Zone.Unique>(this.uniqueZones.length);
        final MaskProvider maskProvider = this.maskProvider.generateUniqueZones(seed, this.uniqueZones, random, uniqueZones);
        return new ZonePatternGenerator(this.pointGenerator, this.zones, uniqueZones.toArray(Zone.Unique[]::new), maskProvider, this.zoneColorMapping);
    }
    
    @Override
    public String toString() {
        return "ZonePatternProvider{pointGenerator=" + String.valueOf(this.pointGenerator) + ", zones=" + Arrays.toString(this.zones) + ", uniqueZones=" + Arrays.toString(this.uniqueZones) + ", maskProvider=" + String.valueOf(this.maskProvider) + ", zoneColorMapping=" + String.valueOf(this.zoneColorMapping);
    }
    
    private static int getMaxExtent(@Nonnull final Zone[] zones) {
        int max = 0;
        for (final Zone zone : zones) {
            for (final Biome biome : zone.biomePatternGenerator().getBiomes()) {
                if (biome.getPrefabContainer() != null) {
                    max = Math.max(max, biome.getPrefabContainer().getMaxSize());
                }
            }
        }
        return max;
    }
}
