package protocolsupport.protocol.packet.middle.clientbound.play;

import java.util.concurrent.ThreadLocalRandom;

import org.bukkit.Sound;
import org.bukkit.entity.Player;

import io.netty.buffer.ByteBuf;
import protocolsupport.api.ProtocolType;
import protocolsupport.api.ProtocolVersion;
import protocolsupport.protocol.ConnectionImpl;
import protocolsupport.protocol.packet.middle.ClientBoundMiddlePacket;
import protocolsupport.protocol.serializer.VarNumberSerializer;
import protocolsupport.protocol.types.networkentity.NetworkEntity;

public abstract class MiddleCollectEffect extends ClientBoundMiddlePacket {

	public MiddleCollectEffect(ConnectionImpl connection) {
		super(connection);
	}

	protected int entityId;
	protected int collectorId;
	protected int itemCount;

	@Override
	protected void readServerData(ByteBuf serverdata) {
		entityId = VarNumberSerializer.readVarInt(serverdata);
		collectorId = VarNumberSerializer.readVarInt(serverdata);
		itemCount = VarNumberSerializer.readVarInt(serverdata);
	}

	@Override
	public void handleReadData() {
		//TODO: send needed collect packets from middle packet itself after implementing serverside entity position cache
		if (
			(collectorId == cache.getEntityCache().getSelfId()) &&
			(version.getProtocolType() == ProtocolType.PC) &&
			version.isBefore(ProtocolVersion.MINECRAFT_1_9)
		) {
			Player player = connection.getPlayer();
			NetworkEntity entity = cache.getEntityCache().getEntity(entityId);
			if ((entity != null) && (player != null)) {
				switch (entity.getType()) {
					case ITEM: {
						player.playSound(
							player.getLocation(), Sound.ENTITY_ITEM_PICKUP,
							0.2F, (((ThreadLocalRandom.current().nextFloat() - ThreadLocalRandom.current().nextFloat()) * 0.7F) + 1.0F) * 2.0F
						);
						break;
					}
					case EXP_ORB: {
						player.playSound(
							player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP,
							0.2F, (((ThreadLocalRandom.current().nextFloat() - ThreadLocalRandom.current().nextFloat()) * 0.7F) + 1.0F) * 2.0F
						);
						break;
					}
					default: {
						break;
					}
				}
			}
		}
	}

}