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

package com.hypixel.hytale.server.core.universe.world.map;

import it.unimi.dsi.fastutil.objects.ObjectIterator;
import com.hypixel.hytale.math.util.ChunkUtil;
import com.hypixel.hytale.protocol.packets.worldmap.MapChunk;
import com.hypixel.hytale.protocol.packets.worldmap.ContextMenuItem;
import com.hypixel.hytale.server.core.util.PositionUtil;
import com.hypixel.hytale.math.vector.Vector3d;
import com.hypixel.hytale.math.vector.Transform;
import com.hypixel.hytale.math.vector.Vector3i;
import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
import javax.annotation.Nonnull;
import com.hypixel.hytale.protocol.packets.worldmap.MapImage;
import it.unimi.dsi.fastutil.longs.Long2ObjectMap;
import com.hypixel.hytale.protocol.packets.worldmap.MapMarker;
import java.util.Map;
import com.hypixel.hytale.protocol.packets.worldmap.UpdateWorldMap;
import com.hypixel.hytale.server.core.io.NetworkSerializable;

public class WorldMap implements NetworkSerializable<UpdateWorldMap>
{
    private final Map<String, MapMarker> pointsOfInterest;
    @Nonnull
    private final Long2ObjectMap<MapImage> chunks;
    private UpdateWorldMap packet;
    
    public WorldMap(final int chunks) {
        this.pointsOfInterest = new Object2ObjectOpenHashMap<String, MapMarker>();
        this.chunks = new Long2ObjectOpenHashMap<MapImage>(chunks);
    }
    
    @Nonnull
    public Map<String, MapMarker> getPointsOfInterest() {
        return this.pointsOfInterest;
    }
    
    @Nonnull
    public Long2ObjectMap<MapImage> getChunks() {
        return this.chunks;
    }
    
    public void addPointOfInterest(final String id, final String name, final String markerType, @Nonnull final Vector3i pos) {
        this.addPointOfInterest(id, name, markerType, new Transform(pos));
    }
    
    public void addPointOfInterest(final String id, final String name, final String markerType, @Nonnull final Vector3d pos) {
        this.addPointOfInterest(id, name, markerType, new Transform(pos));
    }
    
    public void addPointOfInterest(final String id, final String name, final String markerType, @Nonnull final Transform transform) {
        final MapMarker old = this.pointsOfInterest.putIfAbsent(id, new MapMarker(id, name, markerType, PositionUtil.toTransformPacket(transform), null));
        if (old != null) {
            throw new IllegalArgumentException("Id " + id + " already exists!");
        }
    }
    
    @Nonnull
    @Override
    public UpdateWorldMap toPacket() {
        if (this.packet != null) {
            return this.packet;
        }
        final MapChunk[] mapChunks = new MapChunk[this.chunks.size()];
        int i = 0;
        for (final Long2ObjectMap.Entry<MapImage> entry : this.chunks.long2ObjectEntrySet()) {
            final long index = entry.getLongKey();
            final int chunkX = ChunkUtil.xOfChunkIndex(index);
            final int chunkZ = ChunkUtil.zOfChunkIndex(index);
            mapChunks[i++] = new MapChunk(chunkX, chunkZ, entry.getValue());
        }
        return this.packet = new UpdateWorldMap(mapChunks, this.pointsOfInterest.values().toArray(MapMarker[]::new), null);
    }
    
    @Nonnull
    @Override
    public String toString() {
        return "WorldMap{pointsOfInterest=" + String.valueOf(this.pointsOfInterest) + ", chunks=" + String.valueOf(this.chunks);
    }
}
