package com.xcompwiz.lookingglass.network.packet;

import io.netty.buffer.ByteBuf;

import java.util.Collection;

import net.minecraft.client.multiplayer.WorldClient;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.ChunkCoordinates;
import net.minecraft.world.WorldServer;

import com.xcompwiz.lookingglass.client.proxyworld.ProxyWorldManager;
import com.xcompwiz.lookingglass.client.proxyworld.WorldView;
import com.xcompwiz.lookingglass.log.LoggerUtils;

import cpw.mods.fml.common.network.internal.FMLProxyPacket;

/**
 * Based on code from Ken Butler/shadowking97
 */
public class PacketWorldInfo extends PacketHandlerBase {

	public static FMLProxyPacket createPacket(int dimension) {
		WorldServer world = MinecraftServer.getServer().worldServerForDimension(dimension);
		if (world == null) {
			LoggerUtils.warn("Server-side world for dimension %i is null!", dimension);
			return null;
		}
		ChunkCoordinates cc = world.provider.getSpawnPoint();
		int posX = cc.posX;
		int posY = cc.posY;
		int posZ = cc.posZ;
		int skylightSubtracted = world.skylightSubtracted;
		float thunderingStrength = world.thunderingStrength;
		float rainingStrength = world.rainingStrength;
		long worldTime = world.provider.getWorldTime();

		// This line may look like black magic (and, well, it is), but it's actually just returning a class reference for this class. Copy-paste safe.
		ByteBuf data = PacketHandlerBase.createDataBuffer((Class<? extends PacketHandlerBase>) new Object() {}.getClass().getEnclosingClass());

		data.writeInt(dimension);
		data.writeInt(posX);
		data.writeInt(posY);
		data.writeInt(posZ);
		data.writeInt(skylightSubtracted);
		data.writeFloat(thunderingStrength);
		data.writeFloat(rainingStrength);
		data.writeLong(worldTime);

		return buildPacket(data);
	}

	@Override
	public void handle(ByteBuf in, EntityPlayer player) {
		int dimension = in.readInt();
		int posX = in.readInt();
		int posY = in.readInt();
		int posZ = in.readInt();
		int skylightSubtracted = in.readInt();
		float thunderingStrength = in.readFloat();
		float rainingStrength = in.readFloat();
		long worldTime = in.readLong();

		WorldClient proxyworld = ProxyWorldManager.getProxyworld(dimension);

		if (proxyworld == null) return;
		if (proxyworld.provider.dimensionId != dimension) return;

		ChunkCoordinates cc = new ChunkCoordinates();
		cc.set(posX, posY, posZ);
		Collection<WorldView> views = ProxyWorldManager.getWorldViews(dimension);
		for (WorldView view : views) {
			view.updateWorldSpawn(cc);
		}
		proxyworld.setSpawnLocation(posX, posY, posZ);
		proxyworld.skylightSubtracted = skylightSubtracted;
		proxyworld.thunderingStrength = thunderingStrength;
		proxyworld.setRainStrength(rainingStrength);
		proxyworld.setWorldTime(worldTime);
	}
}