#ifndef COMMS_BEHAVIOUR_h
#define COMMS_BEHAVIOUR_h
#include "Arduino.h"
#include "Behaviours.h"
#include <WallVis.h>

/*
 * --------------------------------------------------
 * ---------------- SendCapabilities ----------------
 * --------------------------------------------------
 */

class SendCapabilities : public Behaviour {
   WallVis* _node;

public:
  SendCapabilities(WallVis* node, String name = "SendCapabilities") :
    Behaviour(name), _node(node){ }

  String start(String args) {
    //This is where you do your stuff for a simple behaviour
    _node->announce_capabilities();
    return "SendCapabilities behaviour " + _name;
  }

};

/*
 * --------------------------------------------------
 * ---------------------- Link ----------------------
 * --------------------------------------------------
 */

class Link : public Behaviour {
  WallVis* _node;
  String _peerId;
  const int _timeoutInterval = 5000;
  unsigned long _t = 0;

public:
  Link(WallVis* node, String name = "Link") : Behaviour(name), _node(node)  { _background = true; }

  char* args() {return "<String peerId>"; };

  String start(String args) {
    _running = true;
    if (args == name() || args.indexOf(" ")>0) {
      return "Invalid args (" + args + ") in behaviour " + name();
    }

    _t = millis();

    if (args == _peerId) {
      return "Link ping from (" + _peerId + ")";
    }

    _peerId = args;

    String str = "{\"id\":\"" + String(_node->getId()) + "\",\"Link\":{\"peerId\":\"" + _peerId + "\"}}";
    _node->announce(str);

    return "New link with (" + _peerId + ")";
  }

  void update() {
    if (millis() > (_t+_timeoutInterval)) {
      String str = "{\"id\":\"" + String(_node->getId()) + "\",\"Unlink\":{\"peerId\":\"" + _peerId + "\"}}";
     _node->announce(str);
      _peerId = "";
      _running = false;
    }
  }

};

/*
 * --------------------------------------------------
 * ------------------- PingServer -------------------
 * --------------------------------------------------
 */

class PingServer : public Behaviour {
  WallVis* _node;
  String str;
  const int _interval = 4000;
  unsigned long _t = 0;

public:
  PingServer(WallVis* node, String name = "PingServer") : Behaviour(name), _node(node) { _background = true; }

  String start(String args) {
    _background = true;
    _running = true;
    _t = millis();
    str = "{\"id\":\"" + String(_node->getId()) + "\",\"PingServer\":{}}";
    _node->announce(str);
    return "Pinging server";
  }

  void update() {
    if (millis() > (_t+_interval)) {
      _t = millis();
     _node->announce(str);
    }
  }

};

#endif