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

import java.awt.AWTException;
import java.awt.MouseInfo;
import java.awt.Robot;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.io.File;
import java.util.ArrayList;
import java.util.List;

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-Minecraft Remote Client";
	}

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

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

	@Override
	public String getDescription() {
		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

	}

	boolean wPressed = false;

	boolean aPressed = false;

	boolean sPressed = false;

	boolean dPressed = false;
	boolean landscape = true;

	@Override
	public void onMessageReceived(String msg) {
		System.out.println(msg);
		// ## MOUSE ##
		if (msg.startsWith("MOUSE_")) {
			if (msg.startsWith("MOUSE_LEFT")) {
//				if (msg.endsWith("_PRESS")) {
					mouseCntrl.mousePress(InputEvent.BUTTON1_MASK);
//				}
//				if (msg.endsWith("_RELEASE")) {
					mouseCntrl.mouseRelease(InputEvent.BUTTON1_MASK);
//				}
			}
			if (msg.startsWith("MOUSE_RIGHT")) {
//				if (msg.endsWith("_PRESS")) {
					mouseCntrl.mousePress(InputEvent.BUTTON2_MASK);
//				}
//				if (msg.endsWith("_RELEASE")) {
					mouseCntrl.mouseRelease(InputEvent.BUTTON2_MASK);
//				}
			}
		}
		// ## KEY SPACE ##
		if (msg.startsWith("JUMP")) {
//			if (msg.endsWith("_PRESS")) {
				mouseCntrl.keyPress(KeyEvent.VK_SPACE);
//			}
//			if (msg.endsWith("_RELEASE")) {
				mouseCntrl.keyRelease(KeyEvent.VK_SPACE);
//			}
		}
		// ## MOUSE MOVE ##
		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));
			if (landscape == true) {
				moveMouse(msgX, msgY, 5);
			} else {
				moveMouse(msgY, msgX, 5);
			}
		}
		// ## PLAYER MOVE ##
		if (landscape == false) {
			// pitch
			if (msg.startsWith("ptch_")) {
				if (msg.endsWith("_1")) {
					mouseCntrl.keyPress(KeyEvent.VK_W);
					wPressed = true;
				}
				if (msg.endsWith("_0")) {
					releaseWSKeys();
				}
				if (msg.endsWith("_-1")) {
					mouseCntrl.keyPress(KeyEvent.VK_S);
					sPressed = true;
				}
			}
			// roll
			if (msg.startsWith("rll_")) {
				if (msg.endsWith("_1")) {
					mouseCntrl.keyPress(KeyEvent.VK_D);
					dPressed = true;
				}
				if (msg.endsWith("_0")) {
					releaseADKeys();
				}
				if (msg.endsWith("_-1")) {
					mouseCntrl.keyPress(KeyEvent.VK_A);
					aPressed = true;
				}
			}
		} else {
			// landcape true
			// pitch
			if (msg.startsWith("ptch_")) {
				if (msg.endsWith("_1")) {
					mouseCntrl.keyPress(KeyEvent.VK_A);
					aPressed = true;
				}
				if (msg.endsWith("_0")) {
					releaseADKeys();
				}
				if (msg.endsWith("_-1")) {
					mouseCntrl.keyPress(KeyEvent.VK_D);
					dPressed = true;
				}
			}
			// roll
			if (msg.startsWith("rll_")) {
				if (msg.endsWith("_1")) {
					mouseCntrl.keyPress(KeyEvent.VK_W);
					wPressed = true;
				}
				if (msg.endsWith("_0")) {
					releaseWSKeys();
				}
				if (msg.endsWith("_-1")) {
					mouseCntrl.keyPress(KeyEvent.VK_S);
					sPressed = true;
				}

			}
		}
	}

	private void releaseWSKeys() {
		if (wPressed == true) {
			mouseCntrl.keyRelease(KeyEvent.VK_W);
			wPressed = false;
		}
		if (sPressed == true) {
			mouseCntrl.keyRelease(KeyEvent.VK_S);
			sPressed = false;
		}
	}

	private void releaseADKeys() {
		if (dPressed == true) {
			mouseCntrl.keyRelease(KeyEvent.VK_D);
			dPressed = false;
		}
		if (aPressed == true) {
			mouseCntrl.keyRelease(KeyEvent.VK_A);
			aPressed = false;
		}
	}

	private 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
		// TODO change offset here
		mouseCntrl.mouseMove((int) newMouseX - 1280, (int) newMouseY);
	}

	private 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
	}

}
