package net.minecraft.advancements;

import net.minecraft.commands.CustomFunction.a;
import net.minecraft.resources.MinecraftKey;

import com.bergerkiller.generated.net.minecraft.advancements.AdvancementRewardsHandle;
import com.bergerkiller.generated.net.minecraft.resources.MinecraftKeyHandle;

// Since Minecraft 1.12
optional class Advancement {

    public static org.bukkit.advancement.Advancement toBukkit(Object advancement_or_holder) {
#if version >= 1.20.2
        return ((AdvancementHolder) advancement_or_holder).toBukkit();
#else
        return ((Advancement) advancement_or_holder).bukkit;
#endif
    }
}

// Since Minecraft 1.12
optional class AdvancementRewards {

#if version >= 1.20.3
    private final int experience;
    private final (List<MinecraftKeyHandle>) List<MinecraftKey> loot;
    private final (List<MinecraftKeyHandle>) List<MinecraftKey> recipes;
    private final (Object) java.util.Optional<net.minecraft.commands.CacheableFunction> function;
#elseif version >= 1.17
    private final int experience;
    private final (List<MinecraftKeyHandle>) MinecraftKey[] loot;
    private final (List<MinecraftKeyHandle>) MinecraftKey[] recipes;
    private final (Object) CustomFunction.a function;
#else
    private final int experience:b;
    private final (List<MinecraftKeyHandle>) MinecraftKey[] loot:c;
    private final (List<MinecraftKeyHandle>) MinecraftKey[] recipes:d;
    private final (Object) CustomFunction.a function:e;
#endif

    public static boolean isNoneFunction(Object function) {
#if version >= 1.20.3
        return !((java.util.Optional) function).isPresent();
#elseif version >= 1.17
        return function == net.minecraft.commands.CustomFunction$a.NONE;
#else
        return function == net.minecraft.commands.CustomFunction$a.a;
#endif
    }

    public static Object getNoneFunction() {
#if version >= 1.20.3
        // Note: Must return a valid CachableFunction instance, because we want to override a method in it
        //       Normally it would just be an empty Optional...
        return java.util.Optional.of(new net.minecraft.commands.CacheableFunction((MinecraftKey) null));
#elseif version >= 1.17
        return net.minecraft.commands.CustomFunction$a.NONE;
#else
        return net.minecraft.commands.CustomFunction$a.a;
#endif
    }

    public static (AdvancementRewardsHandle) AdvancementRewards getRewardsOf(org.bukkit.advancement.Advancement advancement) {
        if (!(advancement instanceof org.bukkit.craftbukkit.advancement.CraftAdvancement)) {
            return null;
        }
        org.bukkit.craftbukkit.advancement.CraftAdvancement craftAdv = (org.bukkit.craftbukkit.advancement.CraftAdvancement) advancement;

        net.minecraft.advancements.Advancement advancement;
#if version >= 1.20.2
        advancement = craftAdv.getHandle().value();
#else
        advancement = craftAdv.getHandle();
#endif

#if version >= 1.20.2
        return advancement.rewards();
#elseif version >= 1.18
        return advancement.getRewards();
#else
        return advancement.d();
#endif
    }
}
