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;

  @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));
      moveMouse(msgX, msgY, 5);
    }
    // ## PLAYER MOVE ##
    // 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;
      }
    }
  }

  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
    mouseCntrl.mouseMove((int) newMouseX, (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
  }

}
