package org.sandboxpowered.sandbox.fabric.mixin.event.enchant;

import net.minecraft.item.ItemStack;
import org.sandboxpowered.sandbox.api.enchantment.Enchantment;
import org.sandboxpowered.sandbox.api.event.EnchantmentEvent;
import org.sandboxpowered.sandbox.api.event.EventResult;
import org.sandboxpowered.sandbox.fabric.event.EventDispatcher;
import org.sandboxpowered.sandbox.fabric.util.WrappingUtil;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;

@Mixin(net.minecraft.enchantment.Enchantment.class)
public abstract class MixinEnchantment {

    @Inject(method = "isAcceptableItem", at = @At(value = "HEAD"), cancellable = true)
    public void isAcceptableItem(ItemStack stack, CallbackInfoReturnable<Boolean> info) {
        EnchantmentEvent.AcceptableItem event = EventDispatcher.publish(new EnchantmentEvent.AcceptableItem((Enchantment) this, WrappingUtil.cast(stack, org.sandboxpowered.sandbox.api.item.ItemStack.class)));
        if (event.getResult() != EventResult.IGNORE) {
            info.setReturnValue(event.getResult() == EventResult.SUCCESS);
        }
    }

    @Inject(method = "isDifferent", at = @At(value = "HEAD"), cancellable = true)
    public void isDifferent(net.minecraft.enchantment.Enchantment other, CallbackInfoReturnable<Boolean> info) {
        EnchantmentEvent.Compatible event = EventDispatcher.publish(new EnchantmentEvent.Compatible((Enchantment) this, (Enchantment) other));
        if (event.getResult() != EventResult.IGNORE) {
            info.setReturnValue(event.getResult() == EventResult.SUCCESS);
        }
    }
}