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

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

import com.hypixel.hytale.server.worldgen.biome.Biome;
import com.hypixel.hytale.server.worldgen.zone.Zone;
import com.hypixel.hytale.math.shape.Box2D;
import com.hypixel.hytale.protocol.packets.worldmap.UpdateWorldMapSettings;
import com.hypixel.hytale.protocol.packets.worldmap.BiomeData;
import java.util.HashMap;
import com.hypixel.hytale.server.core.universe.world.worldmap.WorldMapSettings;
import com.hypixel.hytale.server.worldgen.container.UniquePrefabContainer;
import com.hypixel.hytale.logger.sentry.SkipSentryException;
import com.hypixel.hytale.protocol.packets.worldmap.MapMarker;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import com.hypixel.hytale.server.core.universe.world.World;
import java.util.concurrent.Executor;
import javax.annotation.Nonnull;
import com.hypixel.hytale.server.worldgen.chunk.ChunkGenerator;
import com.hypixel.hytale.server.core.universe.world.map.WorldMap;
import com.hypixel.hytale.server.core.universe.world.worldmap.provider.chunk.ChunkWorldMap;

public class GeneratorChunkWorldMap extends ChunkWorldMap
{
    private static final WorldMap EMPTY;
    @Nonnull
    private final ChunkGenerator generator;
    @Nonnull
    private final Executor executor;
    
    public GeneratorChunkWorldMap(@Nonnull final ChunkGenerator generator, @Nonnull final Executor executor) {
        this.generator = generator;
        this.executor = executor;
    }
    
    @Nonnull
    @Override
    public CompletableFuture<Map<String, MapMarker>> generatePointsOfInterest(@Nonnull final World world) {
        final int seed = (int)world.getWorldConfig().getSeed();
        final UniquePrefabContainer.UniquePrefabEntry[] uniquePrefabs = this.generator.getUniquePrefabs(seed);
        if (uniquePrefabs == null || uniquePrefabs.length == 0) {
            return CompletableFuture.completedFuture(GeneratorChunkWorldMap.EMPTY.getPointsOfInterest());
        }
        return CompletableFuture.supplyAsync(() -> {
            final WorldMap worldMap = new WorldMap(0);
            final UniquePrefabContainer.UniquePrefabEntry[] arr$ = uniquePrefabs;
            for (int len$ = arr$.length, i$ = 0; i$ < len$; ++i$) {
                final UniquePrefabContainer.UniquePrefabEntry entry = arr$[i$];
                if (!entry.isSpawnLocation()) {
                    if (!(!entry.isShowOnMap())) {
                        worldMap.addPointOfInterest("UniquePrefab-" + entry.getName() + "-" + String.valueOf(entry.getPosition()), entry.getName(), "Prefab.png", entry.getPosition());
                    }
                }
            }
            return worldMap.getPointsOfInterest();
        }, this.executor).exceptionally(t -> {
            throw new SkipSentryException(t);
        });
    }
    
    @Nonnull
    @Override
    public WorldMapSettings getWorldMapSettings() {
        final Map<Short, BiomeData> biomeDataMap = new HashMap<Short, BiomeData>();
        for (final Zone zone : this.generator.getZonePatternProvider().getZones()) {
            for (final Biome biome : zone.biomePatternGenerator().getBiomes()) {
                final int biomeId = biome.getId();
                if (biomeId < 0 || biomeId > 32767) {
                    throw new IllegalArgumentException("Biome Id can't be < 0 || > 32767! BiomeId: " + biomeId);
                }
                final BiomeData biomeData = new BiomeData(zone.id(), zone.name(), biome.getName(), biome.getMapColor());
                final BiomeData old = biomeDataMap.putIfAbsent((short)biomeId, biomeData);
                if (old != null) {
                    throw new IllegalArgumentException("Multiple biomes with the same ID! New: " + String.valueOf(biomeData) + ", Old: " + String.valueOf(old));
                }
            }
        }
        final UpdateWorldMapSettings settingsPacket = new UpdateWorldMapSettings();
        settingsPacket.biomeDataMap = biomeDataMap;
        settingsPacket.defaultScale = 128.0f;
        settingsPacket.minScale = 32.0f;
        settingsPacket.maxScale = 175.0f;
        return new WorldMapSettings(null, 3.0f, 2.0f, 3, 32, settingsPacket);
    }
    
    static {
        EMPTY = new WorldMap(0);
    }
}
