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

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

import com.hypixel.hytale.math.vector.Vector2i;
import java.util.concurrent.CompletableFuture;
import com.hypixel.hytale.server.worldgen.container.UniquePrefabContainer;
import com.hypixel.hytale.server.worldgen.biome.BiomePatternGenerator;
import javax.annotation.Nullable;
import com.hypixel.hytale.server.worldgen.cave.CaveGenerator;
import javax.annotation.Nonnull;

record Zone(int id, @Nonnull String name, @Nonnull ZoneDiscoveryConfig discoveryConfig, @Nullable CaveGenerator caveGenerator, @Nonnull BiomePatternGenerator biomePatternGenerator, @Nonnull UniquePrefabContainer uniquePrefabContainer) {
    @Nonnull
    public ZoneDiscoveryConfig discoveryConfig() {
        return this.discoveryConfig;
    }
    
    @Nonnull
    public BiomePatternGenerator biomePatternGenerator() {
        return this.biomePatternGenerator;
    }
    
    @Nullable
    public CaveGenerator caveGenerator() {
        return this.caveGenerator;
    }
    
    @Nonnull
    public UniquePrefabContainer uniquePrefabContainer() {
        return this.uniquePrefabContainer;
    }
    
    @Override
    public int hashCode() {
        return this.id;
    }
    
    @Nonnull
    @Override
    public String toString() {
        return "Zone{id=" + this.id + ", name='" + this.name + "', discoveryConfig=" + String.valueOf(this.discoveryConfig) + ", caveGenerator=" + String.valueOf(this.caveGenerator) + ", biomePatternGenerator=" + String.valueOf(this.biomePatternGenerator) + ", uniquePrefabContainer=" + String.valueOf(this.uniquePrefabContainer);
    }
    
    record Unique(@Nonnull Zone zone, @Nonnull CompletableFuture<Vector2i> position) {
        public Vector2i getPosition() {
            return this.position.join();
        }
        
        @Nonnull
        public Zone zone() {
            return this.zone;
        }
        
        @Nonnull
        public CompletableFuture<Vector2i> position() {
            return this.position;
        }
    }
    
    record UniqueEntry(@Nonnull Zone zone, int color, int[] parent, int radius, int padding) {
        @Nonnull
        public static final UniqueEntry[] EMPTY_ARRAY;
        
        public boolean matchesParent(final int color) {
            for (final int p : this.parent) {
                if (p == color) {
                    return true;
                }
            }
            return false;
        }
        
        @Nonnull
        public Zone zone() {
            return this.zone;
        }
        
        static {
            EMPTY_ARRAY = new UniqueEntry[0];
        }
    }
    
    record UniqueCandidate(@Nonnull UniqueEntry zone, @Nonnull Vector2i[] positions) {
        public static final UniqueCandidate[] EMPTY_ARRAY;
        
        @Nonnull
        public UniqueEntry zone() {
            return this.zone;
        }
        
        @Nonnull
        public Vector2i[] positions() {
            return this.positions;
        }
        
        static {
            EMPTY_ARRAY = new UniqueCandidate[0];
        }
    }
}
