import processing.serial.*;
import processing.net.*;
//Web server
String HTTP_GET_REQUEST = "GET /";
String HTTP_HEADER = "HTTP/1.0 200 OK\r\nAccess-Control-Allow-Origin: *\r\nContent-Type: text/plain\r\n\r\n";

Server s;
Client c;
String input;

//Serial
int lf = 10;    // Linefeed in ASCII
String myString = null;
Serial mySerial;  // The serial port;
boolean conn = false;

void setup() 
{
  //PImage titlebaricon = loadImage("icon.png");
  //surface.setIcon(titlebaricon);
  size(100, 100);  // Size must be the first statement
  s = new Server(this, 8080); // start server on http-alt
  //textFont(createFont("SourceCodePro-Regular.ttf", 24));
}

void draw() 
{
  background(255, 255, 255);   // Clear the screen with a black background
  fill(0, 0, 0);
  text("timerConnect", 0, 20);
  text((conn ? "Conectado!" : "Desconectado!"), 0, 50);
  // Receive data from client
  c = s.available();
  if (c != null) {
    input = c.readString();
    input = input.substring(0, input.indexOf("\n")); // Only up to the newline

    if (input.indexOf(HTTP_GET_REQUEST) == 0) {
      try {
        c.write(HTTP_HEADER);
        if (input.indexOf("status") > 0) {
          if (conn) { 
            c.write("true");
          } else { 
            c.write("false");
          }
        } else if (input.indexOf("list") > 0) {
          for (int i = 0; i < Serial.list().length; i++) {
            c.write(Serial.list()[i] + "\n");
          }
        } else if (input.indexOf("conn?d=") > 0) {
          if (conn) {
            c.write("false");
          } else {
            input = input.replace("conn?d=", "");
            try {
              mySerial = new Serial(this, Serial.list()[int(input)], 9600);
              mySerial.clear();
              c.write("true");
              conn = true;
            }
            catch(RuntimeException e) {
              c.write("false");
              conn = false;
            }
          }
        } else if (input.indexOf("disconn") > 0) {
          if (conn) {
            mySerial.stop();
            conn = false;
            c.write("true");
          } else {
            c.write("false");
          }
        } else if (input.indexOf("readLine") > 0) {
          try {
            if (mySerial.available() > 0 && conn) {
              String retorno = mySerial.readStringUntil(lf);
              c.write(retorno == null ? "false" : retorno);
            } else {
              c.write("false");
            }
          }
          catch (NullPointerException e) {
            c.write("false");
          }
        } else {
          c.write("<!DOCTYPE html><html><meta charset=\"utf-8\"><body>");
          c.write("<h1>Timer connect</h1>");
          c.write("<p>o Timer connect, utilizado para conectar com um timer externo, está instalado corretamente e está funcionando!</p>");
          c.write("<h2>Abaixo estão as funções disponíveis:</h2>");
          c.write("<ul>");
          c.write("<li><a href=\"/status\">/status</a> - Verificar status (true = conectado; false = desconectado)</li>");
          c.write("<li><a href=\"/list\">/list</a> - Verificar dispositivos disponíveis</li>");
          c.write("<li><a href=\"/conn?d=\">/conn?d=</a> - Conectar com dispositivo (d = índice do dispositivo começando em 0; retorna true se bem-sucedido ou false se já está conectado)</li>");
          c.write("<li><a href=\"/disconn\">/disconn</a> - Desconectar (true = desconectado; false = já estava desconectado)</li>");
          c.write("<li><a href=\"/readLine\">/readLine</a> - Ler dados do dispositivo (retorna false se não tem dados ou está desconectado)</li>");
          c.write("</ul>");
          c.write("</body></html>");
        }
        c.stop();
      }
      catch(Exception e) {
        //Nada
      }
    }
  }
}
