package net.minecraft.world.item;

import net.minecraft.core.component.DataComponents;
import net.minecraft.world.item.component.CustomData;

import net.minecraft.nbt.NBTBase;
import net.minecraft.nbt.NBTNumber;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagLong;

import net.minecraft.world.level.saveddata.maps.MapId;

#require net.minecraft.world.item.ItemStack public int getItemStackMapId() {
#if version >= 1.20.5
    MapId mapId = (MapId) instance.get(DataComponents.MAP_ID);
    return (mapId == null) ? -1 : mapId.id();
#elseif version >= 1.13
    NBTTagCompound metadata = instance.getTag();
    if (metadata == null) {
        return -1;
    }
    NBTBase mapId = metadata.get("map");
    if (!(mapId instanceof NBTNumber)) {
        return -1;
    }
  #if version >= 1.18
    return ((NBTNumber) mapId).getAsInt();
  #elseif version >= 1.13.2
    return ((NBTNumber) mapId).asInt();
  #elseif version >= 1.10.2
    return ((NBTNumber) mapId).e();
  #else
    return ((NBTNumber) mapId).d();
  #endif
#else
    return instance.getData();
#endif
}

#require net.minecraft.world.item.ItemStack public java.util.UUID getItemStackMapDisplayUUID() {
#if version >= 1.20.5
    CustomData customData = (CustomData) instance.get(DataComponents.CUSTOM_DATA);
    if (customData == null) {
        return null;
    }

  #if version >= 1.21.9
    #require net.minecraft.world.item.component.CustomData private final readonly NBTTagCompound cmd_tag:tag;
    NBTTagCompound metadata = customData#cmd_tag; // Note: unmodifiable!
  #else
    NBTTagCompound metadata = customData.getUnsafe(); // Note: unmodifiable!
  #endif
#else
    NBTTagCompound metadata = instance.getTag();
#endif
    if (metadata != null) {
        NBTBase mapDisplayUUIDMost = metadata.get("mapDisplayUUIDMost");
        if (mapDisplayUUIDMost instanceof NBTTagLong) {
            NBTBase mapDisplayUUIDLeast = metadata.get("mapDisplayUUIDLeast");
            if (mapDisplayUUIDLeast instanceof NBTTagLong) {
                long mostBits, leastBits;
#if version >= 1.18
                mostBits = ((NBTTagLong) mapDisplayUUIDMost).getAsLong();
                leastBits = ((NBTTagLong) mapDisplayUUIDLeast).getAsLong();
#elseif version >= 1.13.2
                mostBits = ((NBTTagLong) mapDisplayUUIDMost).asLong();
                leastBits = ((NBTTagLong) mapDisplayUUIDLeast).asLong();
#elseif version >= 1.10.2
                mostBits = ((NBTTagLong) mapDisplayUUIDMost).d();
                leastBits = ((NBTTagLong) mapDisplayUUIDLeast).d();
#else
                mostBits = ((NBTTagLong) mapDisplayUUIDMost).c();
                leastBits = ((NBTTagLong) mapDisplayUUIDLeast).c();
#endif
                return new java.util.UUID(mostBits, leastBits);
            }
        }
    }
    return null;
}