package net.torocraft.toroquest.network.message;

import io.netty.buffer.ByteBuf;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraftforge.fml.common.network.ByteBufUtils;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler;
import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
import net.minecraftforge.fml.relauncher.Side;
import net.torocraft.toroquest.civilization.CivilizationType;
import net.torocraft.toroquest.civilization.Province;
import net.torocraft.toroquest.civilization.player.PlayerCivilizationCapabilityImpl;

public class MessageSetPlayerReputation implements IMessage {

	private CivilizationType civ;
	private int amount;

	public MessageSetPlayerReputation() {

	}

	public MessageSetPlayerReputation(CivilizationType civ, int amount) {
		this.civ = civ;
		this.amount = amount;
	}

	@Override
	public void fromBytes(ByteBuf buf) {
		amount = buf.readInt();
		civ = e(ByteBufUtils.readUTF8String(buf));
	}

	@Override
	public void toBytes(ByteBuf buf) {
		buf.writeInt(amount);
		ByteBufUtils.writeUTF8String(buf, s(civ));

	}

	public static class Worker {
		public void work(MessageSetPlayerReputation message) {
			Minecraft minecraft = Minecraft.getMinecraft();
			final EntityPlayer player = minecraft.player;

			if (player == null) {
				return;
			}

			PlayerCivilizationCapabilityImpl.get(player).setReputation(message.civ, message.amount);
		}

		private String s(Province civ) {
			if (civ == null) {
				return null;
			}
			return civ.toString();
		}
	}

	public static class Handler implements IMessageHandler<MessageSetPlayerReputation, IMessage> {
		@Override
		public IMessage onMessage(final MessageSetPlayerReputation message, MessageContext ctx) {
			if (ctx.side != Side.CLIENT) {
				return null;
			}

			Minecraft.getMinecraft().addScheduledTask(new Runnable() {
				@Override
				public void run() {
					new Worker().work(message);
				}
			});

			return null;
		}
	}

	private static String s(CivilizationType civ) {
		try {
			return civ.toString();
		} catch (Exception e) {
			return "";
		}
	}

	private int i(Integer integer) {
		if (integer == null) {
			return 0;
		}
		return integer;
	}

	private CivilizationType e(String s) {
		try {
			return CivilizationType.valueOf(s);
		} catch (Exception e) {
			return null;
		}
	}
}