package org.bukkit.craftbukkit;

import net.minecraft.world.entity.decoration.Paintings;
import net.minecraft.core.Holder;
import net.minecraft.core.IRegistry;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.world.entity.decoration.PaintingVariant;

class CraftArt {
#if version >= 1.19
  #if version >= 1.20.2
    public static org.bukkit.Art NotchToBukkit:minecraftHolderToBukkit((Object) Holder<PaintingVariant> art);
    public static (Object) Holder<PaintingVariant> BukkitToNotch:bukkitToMinecraftHolder(org.bukkit.Art art);
  #else
    public static org.bukkit.Art NotchToBukkit((Object) Holder<PaintingVariant> art);
    public static (Object) Holder<PaintingVariant> BukkitToNotch(org.bukkit.Art art);
  #endif

    #require BuiltInRegistries public static net.minecraft.core.IRegistry getPaintingVariantRegistry() {
  #if version >= 1.21
        return org.bukkit.craftbukkit.CraftRegistry.getMinecraftRegistry(net.minecraft.core.registries.Registries.PAINTING_VARIANT);
  #else
        return BuiltInRegistries.PAINTING_VARIANT;
  #endif
    }

    public static (Object) Holder<PaintingVariant> NotchFromInternalId(int internalId) {
        IRegistry paintingRegistry = #getPaintingVariantRegistry();
  #if version >= 1.21.2
        java.util.Optional opt = paintingRegistry.get(internalId);
  #else
        java.util.Optional opt = paintingRegistry.getHolder(internalId);
  #endif
        return (Holder) opt.orElse(null);
    }

    public static int NotchToInternalId((Object) Holder<PaintingVariant> art) {
        IRegistry paintingRegistry = #getPaintingVariantRegistry();
        return paintingRegistry.getId((Object) art.value());
    }

    public static (Object) Holder<PaintingVariant> NotchFromInternalName(String internalName) {
        // Dear god...
        net.minecraft.resources.MinecraftKey key = #parseMinecraftKey(internalName);
        IRegistry paintingRegistry = #getPaintingVariantRegistry();
  #if version >= 1.21.2
        Object valueAtKey = paintingRegistry.getValue(key);
  #else
        Object valueAtKey = paintingRegistry.get(key);
  #endif
        if (valueAtKey == null) {
            return null;
        }
        int internalId = paintingRegistry.getId(valueAtKey);
  #if version >= 1.21.2
        java.util.Optional opt = paintingRegistry.get(internalId);
  #else
        java.util.Optional opt = paintingRegistry.getHolder(internalId);
  #endif
        return (Holder) opt.orElse(null);
    }

    public static String NotchToInternalName((Object) Holder<PaintingVariant> art) {
        IRegistry paintingRegistry = #getPaintingVariantRegistry();
        net.minecraft.resources.MinecraftKey key = (net.minecraft.resources.MinecraftKey) paintingRegistry.getKey((Object) art.value());
        return (key == null) ? null : key.getPath();
    }

#else
    public static org.bukkit.Art NotchToBukkit((Object) Paintings art);
    public static (Object) Paintings BukkitToNotch(org.bukkit.Art art);

    public static (Object) Paintings NotchFromInternalId(int internalId) {
  #if version >= 1.18
        return (Paintings) BuiltInRegistries.MOTIVE.byId(internalId);
  #elseif version >= 1.13.1
        return (Paintings) BuiltInRegistries.MOTIVE.fromId(internalId);
  #elseif version >= 1.13
        return (Paintings) Paintings.a.getId(internalId);
  #else
        Paintings[] values = Paintings.values();
        if (internalId >= 0 && internalId < values.length) {
            return values[internalId];
        }
        return Paintings.KEBAB;
  #endif
    }

    public static int NotchToInternalId((Object) Paintings art) {
  #if version >= 1.17
        return BuiltInRegistries.MOTIVE.getId((Object) art);
  #elseif version >= 1.13.1
        return BuiltInRegistries.MOTIVE.a((Object) art);
  #elseif version >= 1.13
        return Paintings.a.a((Object) art);
  #else
        return art.ordinal();
  #endif
    }

    public static (Object) Paintings NotchFromInternalName(String internalName) {
        net.minecraft.resources.MinecraftKey key = #parseMinecraftKey(internalName);
  #if version >= 1.13.1
        return (Paintings) BuiltInRegistries.MOTIVE.get(key);
  #elseif version >= 1.13
        return (Paintings) Paintings.a.get(key);
  #else
        Paintings[] values = Paintings.values();
        for (int i = 0; i < values.length; i++) {
            if (values[i].B.equals(internalName)) {
                return values[i];
            }
        }
        return Paintings.KEBAB;
  #endif
    }

    public static String NotchToInternalName((Object) Paintings art) {
  #if version >= 1.18
        net.minecraft.resources.MinecraftKey key = (net.minecraft.resources.MinecraftKey) BuiltInRegistries.MOTIVE.getKey((Object) art);
        return (key == null) ? null : key.getPath();
  #elseif version >= 1.13.1
        net.minecraft.resources.MinecraftKey key = (net.minecraft.resources.MinecraftKey) BuiltInRegistries.MOTIVE.getKey((Object) art);
        return (key == null) ? null : key.getKey();
  #elseif version >= 1.13
        net.minecraft.resources.MinecraftKey key = (net.minecraft.resources.MinecraftKey) Paintings.a.b(art);
        return (key == null) ? null : key.getKey();
  #else
        return art.B;
  #endif
    }
#endif
}
