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

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

import java.util.function.Consumer;
import javax.annotation.Nullable;
import javax.annotation.Nonnull;

public class ClimateType
{
    public static final ClimateType[] EMPTY_ARRAY;
    private static final int MAX_DEPTH = 10;
    public static final int IS_ISLAND = 536870912;
    public static final int IS_SHORE = 1073741824;
    public static final int IS_OCEAN = Integer.MIN_VALUE;
    public static final int IS_MAINLAND = 0;
    public static final int IS_MAINLAND_SHORE = 1073741824;
    public static final int IS_MAINLAND_SHALLOW_OCEAN = -1073741824;
    public static final int IS_ISLAND_SHORE = 1610612736;
    public static final int IS_ISLAND_SHALLOW_OCEAN = -536870912;
    public static final int MASK = 536870911;
    @Nonnull
    public final String name;
    @Nonnull
    public final ClimateColor color;
    @Nonnull
    public final ClimateColor island;
    @Nonnull
    public final ClimatePoint[] points;
    @Nonnull
    public final ClimateType[] children;
    
    public ClimateType(@Nonnull final String name, @Nonnull final ClimateColor color, @Nonnull final ClimateColor island, @Nonnull final ClimatePoint[] points, @Nonnull final ClimateType[] children) {
        this.name = name;
        this.color = color;
        this.island = island;
        this.points = points;
        this.children = children;
    }
    
    @Override
    public String toString() {
        return this.name;
    }
    
    public static String name(@Nullable final ClimateType parent, @Nonnull final ClimateType type) {
        return (parent == null || parent == type) ? type.name : (parent.name + " / " + type.name);
    }
    
    public static void walk(final ClimateType type, final Consumer<ClimateType> visitor) {
        walkRecursive(type, visitor, 0);
    }
    
    public static void walk(final ClimateType[] types, final Consumer<ClimateType> visitor) {
        for (final ClimateType type : types) {
            walkRecursive(type, visitor, 0);
        }
    }
    
    public static int color(final int id, @Nonnull final ClimateGraph climate) {
        final int flags = id & 0xE0000000;
        final ClimateType type = climate.getType(id & 0x1FFFFFFF);
        return switch (flags) {
            case Integer.MIN_VALUE -> type.color.ocean;
            case 1073741824 -> type.color.shore;
            case -1073741824 -> type.color.shallowOcean;
            case 536870912 -> type.island.land;
            case 1610612736 -> type.island.shore;
            case -536870912 -> type.island.shallowOcean;
            default -> type.color.land;
        };
    }
    
    private static void walkRecursive(final ClimateType type, final Consumer<ClimateType> visitor, final int depth) {
        if (depth >= 10) {
            return;
        }
        visitor.accept(type);
        for (final ClimateType child : type.children) {
            walkRecursive(child, visitor, depth + 1);
        }
    }
    
    static {
        EMPTY_ARRAY = new ClimateType[0];
    }
}
