package net.minecraft.world.item;

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

import net.minecraft.nbt.Tag;
import net.minecraft.nbt.NumericTag;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.LongTag;

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
    CompoundTag metadata = instance.getTag();
    if (metadata == null) {
        return -1;
    }
    Tag mapId = metadata.get("map");
    if (!(mapId instanceof NumericTag)) {
        return -1;
    }
  #if version >= 1.18
    return ((NumericTag) mapId).getAsInt();
  #elseif version >= 1.13.2
    return ((NumericTag) mapId).asInt();
  #elseif version >= 1.10.2
    return ((NumericTag) mapId).e();
  #else
    return ((NumericTag) 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 CompoundTag cmd_tag:tag;
    CompoundTag metadata = customData#cmd_tag; // Note: unmodifiable!
  #else
    CompoundTag metadata = customData.getUnsafe(); // Note: unmodifiable!
  #endif
#else
    CompoundTag metadata = instance.getTag();
#endif
    if (metadata != null) {
        Tag mapDisplayUUIDMost = metadata.get("mapDisplayUUIDMost");
        if (mapDisplayUUIDMost instanceof LongTag) {
            Tag mapDisplayUUIDLeast = metadata.get("mapDisplayUUIDLeast");
            if (mapDisplayUUIDLeast instanceof LongTag) {
                long mostBits, leastBits;
#if version >= 1.18
                mostBits = ((LongTag) mapDisplayUUIDMost).getAsLong();
                leastBits = ((LongTag) mapDisplayUUIDLeast).getAsLong();
#elseif version >= 1.13.2
                mostBits = ((LongTag) mapDisplayUUIDMost).asLong();
                leastBits = ((LongTag) mapDisplayUUIDLeast).asLong();
#elseif version >= 1.10.2
                mostBits = ((LongTag) mapDisplayUUIDMost).d();
                leastBits = ((LongTag) mapDisplayUUIDLeast).d();
#else
                mostBits = ((LongTag) mapDisplayUUIDMost).c();
                leastBits = ((LongTag) mapDisplayUUIDLeast).c();
#endif
                return new java.util.UUID(mostBits, leastBits);
            }
        }
    }
    return null;
}