package net.minecraft.sounds;

import net.minecraft.core.RegistryMaterials;
import net.minecraft.resources.MinecraftKey;

import com.bergerkiller.generated.net.minecraft.core.RegistryMaterialsHandle;
import com.bergerkiller.generated.net.minecraft.resources.MinecraftKeyHandle;
import com.bergerkiller.generated.net.minecraft.sounds.SoundEffectHandle;
import com.bergerkiller.generated.net.minecraft.sounds.SoundCategoryHandle;

optional class SoundCategory {
#if version >= 1.18
    public String getName();
#else
    public String getName:a();
#endif

#if version >= 1.13
    public static (SoundCategoryHandle) SoundCategory byName(String name) {
        SoundCategory[] categories = SoundCategory.values();
        for (int i = 0; i < categories.length; i++) {
            SoundCategory cat = categories[i];
  #if version >= 1.18
            if (cat.getName().equals(name)) {
  #else
            if (cat.a().equals(name)) {
  #endif
                return cat;
            }
        }
        return null;
    }
#else
    public static (SoundCategoryHandle) SoundCategory byName:a(String name);
#endif
}

class SoundEffect {
#select version >=
#case 1.17:    private final (MinecraftKeyHandle) MinecraftKey name:location;
#case 1.16:    private final (MinecraftKeyHandle) MinecraftKey name:b;
#case 1.13.1:  private final (MinecraftKeyHandle) MinecraftKey name:a;
#case 1.9:     private final (MinecraftKeyHandle) MinecraftKey name:b;
#case else:    private final (MinecraftKeyHandle) MinecraftKeyHandle name;
#endselect

#if version >= 1.9
    public static final optional (RegistryMaterialsHandle) RegistryMaterials<MinecraftKey, SoundEffect> opt_getRegistry() {
  #if version >= 1.13.1
        return (RegistryMaterials) net.minecraft.core.registries.BuiltInRegistries.SOUND_EVENT;
  #else
        return SoundEffect.a;
  #endif
    }
#else
    public static final optional (RegistryMaterialsHandle) RegistryMaterials<MinecraftKey, SoundEffect> opt_getRegistry:###();
#endif

#if version >= 1.19.3
    public static (SoundEffectHandle) SoundEffect createVariableRangeEvent((MinecraftKeyHandle) MinecraftKey minecraftkey);
#elseif version >= 1.9
    public static (SoundEffectHandle) SoundEffect createVariableRangeEvent((MinecraftKeyHandle) MinecraftKey minecraftkey) {
        return new SoundEffect(minecraftkey);
    }
#else
    public static (SoundEffectHandle) SoundEffect createVariableRangeEvent(MinecraftKeyHandle minecraftkey);
#endif

    <code>
    @Deprecated
    public static SoundEffectHandle createNew(MinecraftKeyHandle name) {
        return createVariableRangeEvent(name);
    }

    public static SoundEffectHandle byName(String name) {
        if (T.opt_getRegistry.isAvailable()) {
            Object mc_key_raw = com.bergerkiller.generated.net.minecraft.resources.MinecraftKeyHandle.T.createNew.raw.invoke(name);
            if (mc_key_raw != null) {
                return createHandle(T.opt_getRegistry.invoke().get(mc_key_raw));
            } else {
                return null;
            }
        } else {
            return createVariableRangeEvent(com.bergerkiller.generated.net.minecraft.resources.MinecraftKeyHandle.createNew(name));
        }
    }
    </code>

}
