'use strict';


//-------External Libraries----------//
var express = require('express');
var app = express();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var robot = require('robotjs');
var config = require('./public/js/config.js');
var url = require("opn");
var fs = require("fs");

//---------GLOBAL STATE VARIABLES ----// 
var screenWidth = 1440;
var screenHeight = 900;
var adjustment = 2;
var mouse = null;
var newX = null;
var newY = null;


// Get screen size from NW desktop
try {
  var gui = window.require('nw.gui');
  gui.Screen.Init();
  var screens = gui.Screen.screens;
  // XXX: currently only take first screen
  var rect = screens[0].bounds;
  screenWidth = rect.width;
  screenHeight = rect.height;
} catch (e) {
  console.log(e);
}


//-------WEB SERVER FUNCTIONALITY -------// 
//Purpose: Sends client information when making http request to main entrypoint
app.get('/', function(req, res) {
  res.sendFile(__dirname + '/public/client.html');
});


//Purpose: use the public directory to send information
app.use('/public', express.static('public'));

//Purpose: Lets the webserver listen for requests on port 8000
var PORT = 8000;
http.listen(PORT, function() {
  console.log('listening on *:' + PORT);
});


//-------MOBILE MOUSE FUNCTIONALITY -------// 

//General Connection Configuration
io.on('connection', function(socket) {
  socket.broadcast.emit('hi');
  console.log('a user connected');
  socket.on('disconnect', function() {
    console.log('user disconnected');
  });

  var keys = []
  var xpos = []
  var ypos = []

  //Load default keyboard
  
  var file = fs.readFileSync("configuration.json")  
  var content = JSON.parse(file)

  for (var key in content) {
    keys.push(content[key][0]);
    xpos.push(content[key][1]);
    ypos.push(content[key][2]);
  }
  socket.emit('updateKeys', {k: keys, x: xpos, y: ypos});

   content = []
  //Load default numpad
  var file = fs.readFileSync("numpad.json")  
  var content = JSON.parse(file)

  var keys = []
  var xpos = []
  var ypos = []

  for (var key in content) {
    keys.push(content[key][0]);
    xpos.push(content[key][1]);
    ypos.push(content[key][2]);
  }
  socket.emit('updateNumPad', {k: keys, x: xpos, y: ypos});
   
  content = []
  //Load default urls
  var file = fs.readFileSync("url.json")  
  content = JSON.parse(file)
  
  var keys = []
  var xpos = []
  var ypos = []
  
  for (var key in content) {
    keys.push(content[key][0]);
    xpos.push(content[key][1]);
    ypos.push(content[key][2]);
  }
  socket.emit('updateUrls', {k: keys, x: xpos, y: ypos}); 

  //Keyboard Functionality
  socket.on('string', function(str) {
    console.log("Trying to type")
    console.log(str);
    if (str === "Go"){
      robot.keyTap('enter');
    }
    else if (str === "space"){
      robot.keyTap('space');
    }
    else if (str === 'del'){
      robot.keyTap('backspace');
    }
    else{
      robot.typeString(str);
    }
  });
  
  socket.on('functionality', function(type) {
    console.log(type);
    switch (type) {
      case 'backspace':
        robot.keyTap('backspace');
        break;
      case 'enter':
        robot.keyTap('enter');
        break;
      case 'ArrowUp':
        robot.keyTap('up');
        break;
      case 'ArrowDown':
        robot.keyTap('down');
        break;
      case 'ArrowLeft':
        robot.keyTap('left');
        break;
      case 'ArrowRight':
        robot.keyTap('right');
        break;
    }
  });

  socket.on('text', function(text) {
    console.log('Typing ' + text);
    if (text === ' ') {
      robot.keyTap('space');
    }
    robot.typeString(text);
  });

  socket.on('saveKey', function(key) {
    var file = fs.readFileSync("configuration.json")  
    var configuration = JSON.parse(file)
    configuration[key.id] = [key.val, key.x, key.y];
    fs.writeFile("./configuration.json", JSON.stringify(configuration, null, 4), 'utf8', error=>{});
  });

  socket.on('url', function(str) {
    console.log("Trying to open url")
    console.log(str)
    url(str)
  });


  //Mouse Functionality
  socket.on('mouse', function(pos) {
    if (pos.pw) {
      if (config.passcode !== pos.pw) { //Password Checker
        return;
      }
    }
    if (pos.cmd == 'move')  {
      mouse = robot.getMousePos(); //Get mouse state
      newX = mouse.x + pos.x * adjustment;
      newY = mouse.y + pos.y * adjustment;
      robot.moveMouse(newX, newY);
      mouse = robot.getMousePos(); //Update mouse state
    }
    else if (pos.cmd == 'scroll'){
      mouse = robot.getMousePos(); //Get mouse state
      robot.scrollMouse(pos.x*5, pos.y*5);
      mouse = robot.getMousePos(); //Update mouse state
    }
    else if (pos.cmd == 'drag') {
      mouse = robot.getMousePos(); //Get mouse state
      newX = mouse.x + pos.x * adjustment;
      newY = mouse.y + pos.y * adjustment;
      robot.dragMouse(newX, newY);
      mouse = robot.getMousePos(); //Update mouse state
    } 
    else if (pos.cmd == 'click') {
      robot.mouseClick();
    } else if (pos.cmd == 'rightclick') {
      robot.mouseClick('right');
    } else if (pos.cmd == 'scrollstart') {
      //robot.mouseToggle('down', 'middle');
    } else if (pos.cmd == 'scrollend') {
      //robot.mouseToggle('up', 'middle');
    } else if (pos.cmd == 'dragstart') {
      robot.mouseToggle('down', 'left');
    } else if (pos.cmd == 'dragend') {
      robot.mouseToggle('up', 'left');
    } else if (pos.cmd == 'right') {
      robot.keyTap("right");
    } else if (pos.cmd == 'left') {
      robot.keyTap("left");
    } else if (pos.cmd == 'doubleclick') {
      robot.mouseClick("left",true);
    }
  });
});