package carpetextra.mixins;

import carpetextra.CarpetExtraSettings;
import carpetextra.helpers.CarpetDispenserBehaviours.*;
import carpetextra.helpers.FeedableItems;
import net.minecraft.block.DispenserBlock;
import net.minecraft.block.dispenser.DispenserBehavior;
import net.minecraft.entity.vehicle.AbstractMinecartEntity;
import net.minecraft.item.*;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import carpetextra.utils.PlaceBlockDispenserBehavior;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;

import java.util.Map;

@Mixin(DispenserBlock.class)
public abstract class DispenserBlockMixin
{
    @Shadow @Final private static Map<Item, DispenserBehavior> BEHAVIORS;

    @Inject(method = "getBehaviorForItem", at = @At("HEAD"), cancellable = true)
    private void getBehaviorForItem(ItemStack itemStack_1, CallbackInfoReturnable<DispenserBehavior> cir)
    {
        Item item = itemStack_1.getItem();
        if (CarpetExtraSettings.dispenserPlacesBlocks && !BEHAVIORS.containsKey(item) && item instanceof BlockItem)
        {
            if (PlaceBlockDispenserBehavior.canPlace(((BlockItem) item).getBlock()))
            {
                cir.setReturnValue(PlaceBlockDispenserBehavior.getInstance());
                cir.cancel();
            }
        }
        //if (item == Items.GLASS_BOTTLE && CarpetExtraSettings.dispensersFillBottles) / implemented in vanilla 1.15
        //    cir.setReturnValue(new WaterBottleDispenserBehaviour());
        
        if (CarpetExtraSettings.dispensersFillMinecarts)
        {
            if (item == Items.CHEST)
                cir.setReturnValue(new MinecartDispenserBehaviour(AbstractMinecartEntity.Type.CHEST));

            if (item == Items.HOPPER)
                cir.setReturnValue(new MinecartDispenserBehaviour(AbstractMinecartEntity.Type.HOPPER));

            if (item == Items.FURNACE)
                cir.setReturnValue(new MinecartDispenserBehaviour(AbstractMinecartEntity.Type.FURNACE));

            if (item == Items.TNT)
                cir.setReturnValue(new MinecartDispenserBehaviour(AbstractMinecartEntity.Type.TNT));
        }

        if (CarpetExtraSettings.dispensersToggleThings && item == Items.STICK)
            cir.setReturnValue(new TogglingDispenserBehaviour());

        if (CarpetExtraSettings.dispensersPlayRecords && item instanceof MusicDiscItem)
            cir.setReturnValue(new DispenserRecords());
        
        if (CarpetExtraSettings.dispensersTillSoil && item instanceof HoeItem)
            cir.setReturnValue(new TillSoilDispenserBehaviour());

        if (CarpetExtraSettings.dispensersFeedAnimals &&  FeedableItems.ITEMS.contains(item.asItem()))
            cir.setReturnValue(new FeedAnimalDispenserBehaviour());
        
        if (CarpetExtraSettings.dragonsBreathConvertsCobbleToEndstone && item == Items.DRAGON_BREATH)
            cir.setReturnValue(new DragonsBreathDispenserBehaviour());
    }
}