package ellygg.minecraft.mixin;

import net.minecraft.block.*;
import net.minecraft.block.dispenser.*;
import net.minecraft.item.*;
import net.minecraft.entity.vehicle.*;
import net.minecraft.entity.vehicle.BoatEntity.Type;
import net.minecraft.util.math.*;
import net.minecraft.server.world.ServerWorld;

import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.*;
/*import org.spongepowered.asm.mixin.injection.callback.*;*/

@Mixin(targets = "net/minecraft/block/dispenser/DispenserBehavior")
public abstract class DispenserMixin extends FallibleItemDispenserBehavior
{
	@Inject(
            method = "dispenseSilently(Lnet/minecraft/util/math/BlockPointer;Lnet/minecraft/item/ItemStack;)Lnet/minecraft/item/ItemStack;",
            at = @At(value = "INVOKE", shift = At.Shift.BEFORE,
                    target = "Lnet/minecraft/block/dispenser/FallibleItemDispenserBehavior;dispenseSilently(Lnet/minecraft/util/math/BlockPointer;Lnet/minecraft/item/ItemStack;)Lnet/minecraft/item/ItemStack;"),
            cancellable = true
    )
	private void dispenseSilentlyMixin(BlockPointer pointer, ItemStack stack/*, CallbackInfoReturnable<ItemStack> cir*/)
	{
		ServerWorld world = pointer.getWorld();
		BlockState dispenser = world.getBlockState(pointer.getPos());
		Direction dispenserFacing = dispenser.get(DispenserBlock.FACING);
		BlockState dispenserTarget = world.getBlockState(pointer.getPos().offset(dispenserFacing));

		if(stack.getItem() instanceof BoatItem)
		{
			//Boat dispensing
			
			//Check if we are trying to dispense into air
			if(dispenserTarget.getBlock() == Blocks.AIR)
			{
				BoatItem itemBoat = (BoatItem) stack.getItem();
				BoatEntity placedBoat;
				
				String boatInfo = itemBoat.getTranslationKey();
				if(boatInfo.contains("chest"))
				{
					placedBoat = new ChestBoatEntity(world, pointer.getX() + dispenserFacing.getOffsetX(), pointer.getZ() + dispenserFacing.getOffsetY(), pointer.getZ() + dispenserFacing.getOffsetZ());
				}
				else
				{
					placedBoat = new BoatEntity(world, pointer.getX() + dispenserFacing.getOffsetX(), pointer.getZ() + dispenserFacing.getOffsetY(), pointer.getZ() + dispenserFacing.getOffsetZ());
				}

				if(boatInfo.contains("oak"))
				{
					placedBoat.setBoatType(Type.OAK);
				}
				else if(boatInfo.contains("spruce"))
				{
					placedBoat.setBoatType(Type.SPRUCE);
				}
				else if(boatInfo.contains("birch"))
				{
					placedBoat.setBoatType(Type.BIRCH);
				}
				else if(boatInfo.contains("jungle"))
				{
					placedBoat.setBoatType(Type.JUNGLE);
				}
				else if(boatInfo.contains("acacia"))
				{
					placedBoat.setBoatType(Type.ACACIA);
				}
				else if(boatInfo.contains("dark_oak"))
				{
					placedBoat.setBoatType(Type.DARK_OAK);
				}
				else if(boatInfo.contains("mangrove"))
				{
					placedBoat.setBoatType(Type.MANGROVE);
				}

				placedBoat.setYaw(dispenserFacing.asRotation());
				world.spawnEntity(placedBoat);

				stack.decrement(1);
				return;
			}
		}
		else if(stack.getItem() instanceof MusicDiscItem)
		{
			//Music disc dispensing

			//Check if we are trying to dispense into a jukebox
		}
		else if(stack.getItem() instanceof BucketItem)
		{
			//Bucket dispensing

			//Check if we are trying to dispense into a cauldron
		}

		//cir.cancel();
		
	}
}