package de.reinhardt_karlheinz.pcc.pc.plugins.example;

import java.awt.AWTException;
import java.awt.MouseInfo;
import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.io.File;

import de.reinhardt_karlheinz.pcc.interfaces.PCCPlugin;
import de.reinhardt_karlheinz.pcc.interfaces.PCCPluginInterface;

public class PCCMinecraftRemote implements PCCPlugin {

	Robot mouseCntrl;

	@Override
	public String getName() {
		return "PCC-Mnicraft Remote Client";
	}

	@Override
	public String getVersion() {
		return "0.0.1";
	}

	@Override
	public String getAuthor() {
		return "Michael,Nils,Karlheinz";
	}

	@Override
	public String getInformation() {
		return "Remote Control for Minecraft";
	}

	@Override
	public void onPluginStart(PCCPluginInterface plgIntfc) {
		try {
			mouseCntrl = new Robot();
		} catch (AWTException e) {
			e.printStackTrace();
		}
	}

	@Override
	public void onPluginShow() {
		// TODO Auto-generated method stub

	}

	@Override
	public void onPluginHide() {
		// TODO Auto-generated method stub

	}

	@Override
	public void onPluginClose() {
		// TODO Auto-generated method stub

	}

	@Override
	public void onConnectionEstablished() {
		// TODO Auto-generated method stub

	}

	@Override
	public void onConnectionLost() {
		// TODO Auto-generated method stub

	}

	@Override
	public void onMessageReceived(String msg) {
		System.out.println(msg);
		if ("MOUSECLICK".equals(msg)) {
			// mouseCntrl.mousePress(InputEvent.BUTTON1_MASK)
		}
		// double msgAngle, msgLength;
		// int posAnglEnd = msg.indexOf(')');
		// System.out.println("converted angle: " + msg.substring(5,
		// posAnglEnd));
		// msgAngle = Double.parseDouble(msg.substring(5, posAnglEnd));
		// System.out.println("converted lenght: "
		// + msg.substring(msg.indexOf(")lnght(") + 7, msg.length() - 1));
		// msgLength = Double.parseDouble(msg.substring(
		// msg.indexOf(")lnght(") + 7, msg.length() - 1));
		// moveMouse(msgAngle,msgLength);
		if (msg.startsWith("X")) {
			double msgY, msgX;
			int posAnglEnd = msg.indexOf(')');
			System.out.println("converted X: " + msg.substring(2, posAnglEnd));
			msgX = Double.parseDouble(msg.substring(2, posAnglEnd));

			System.out.println("converted Y: "
					+ msg.substring(msg.indexOf(")Y(") + 3, msg.length() - 1));
			msgY = Double.parseDouble(msg.substring(msg.indexOf(")Y(") + 3,
					msg.length() - 1));
			moveMouse(msgX, msgY, 5);
		}
		if (msg.startsWith("ptch_")) {
			if (msg.endsWith("1")) {
				mouseCntrl.keyPress(KeyEvent.VK_W);
				wPressed = true;
			}
			if (msg.endsWith("0")) {
				if (wPressed == true) {
					mouseCntrl.keyRelease(KeyEvent.VK_W);
					wPressed = false;
				} else {
					mouseCntrl.keyRelease(KeyEvent.VK_S);
					sPressed = false;
				}
			}
			if (msg.endsWith("-1")) {
				mouseCntrl.keyPress(KeyEvent.VK_S);
				sPressed = true;
			}
		}
		if (msg.startsWith("rll_")) {
			if (msg.endsWith("1")) {
				mouseCntrl.keyPress(KeyEvent.VK_D);
				dPressed = true;
			}
			if (msg.endsWith("0")) {
				if (dPressed == true) {
					mouseCntrl.keyRelease(KeyEvent.VK_D);
					dPressed = false;
				} else {
					mouseCntrl.keyRelease(KeyEvent.VK_A);
					aPressed = false;
				}
			}
			if (msg.endsWith("-1")) {
				mouseCntrl.keyPress(KeyEvent.VK_A);
				aPressed = true;
			}
		}
	}

	boolean wPressed = false;
	boolean aPressed = false;
	boolean sPressed = false;
	boolean dPressed = false;

	public void moveMouse(double x, double y) {
		double mouseX, mouseY;
		double newMouseX, newMouseY;
		// get mouse pos
		mouseX = MouseInfo.getPointerInfo().getLocation().getX();
		mouseY = MouseInfo.getPointerInfo().getLocation().getY();
		System.out.println("x:" + mouseX + " y:" + mouseY);
		newMouseX = mouseX + x;
		newMouseY = mouseY + y;
		System.out.println("x:" + newMouseX + " y:" + newMouseY);
		// move mouse
		mouseCntrl.mouseMove((int) newMouseX - 1280, (int) newMouseY);
	}

	public void moveMouse(double x, double y, double boost) {
		moveMouse(x * boost, y * boost);
	}

	@Override
	public void onCommandReceived(String cmd) {
		// TODO Auto-generated method stub

	}

	@Override
	public void onFileReceived(File file) {
		// TODO Auto-generated method stub
	}

}
