package net.minecraft.core;

import net.minecraft.resources.MinecraftKey;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.world.item.Item;

// Only available >= MC 1.9
optional class RegistryBlockID {
    public int getId(T value);
}

class RegistryMaterials {
#if version >= 1.13
    protected optional final Map<V, K> opt_inverseLookupField:###;
#else
    protected optional final Map<V, K> opt_inverseLookupField:b;
#endif

#if version >= 1.21.2
    public V get:getValue((Object) MinecraftKey key);
    public (Object) MinecraftKey getKey(V value);
#elseif version >= 1.13.1
    public V get((Object) MinecraftKey key);
    public (Object) MinecraftKey getKey(V value);
#elseif version >= 1.9
    public V get((Object) K key);
    public (Object) K getKey:b(V value);
#else
    public V get((Object) K key);
    public (Object) K getKey:c(V value);
#endif
}

// Since MC 1.14 has static fields
optional class IRegistry {
#if version >= 1.14
    public static Object getWindowTypeByName(String name) {
        if (name == null) return null;
        MinecraftKey key = #parseMinecraftKey(name);
  #if version >= 1.21.2
        return BuiltInRegistries.MENU.getValue(key);
  #else
        return BuiltInRegistries.MENU.get(key);
  #endif
    }
    public static int getWindowTypeId(Object windowTypeRaw) {
        if (windowTypeRaw == null) return -1;
  #if version >= 1.17
        return BuiltInRegistries.MENU.getId(windowTypeRaw);
  #else
        return BuiltInRegistries.MENU.a(windowTypeRaw);
  #endif
    }
#else
    public static Object getWindowTypeByName(String name) {
        return null;
    }
    public static int getWindowTypeId(Object windowTypeRaw) {
        return -1;
    }
#endif
}
