
#ifndef MqttDesencadenadorManagerDef
#define MqttDesencadenadorManagerDef 1
#include <SPI.h>
#include "MqttDefines.h"
#include "MqttVarManager.h"
//expresiones del tipo{1}&{2}
struct MqttExeParam
{
  char oper[3];
  byte noper;
  char var1[8];
  byte nvar1;
  char var2[8];
  byte nvar2;

  byte estado;
  int i;
  bool tvar1;
  bool tvar2;
  bool toper;
  bool tcausa;
  bool res;
  bool sigue;
  bool esAnd;
  MqttExeParam()
  {

    noper=0;
    nvar1=0;  
    nvar2=0;
    estado=0;
    i=0;
    tvar1=false;
    tvar2=false;
    toper=false;
    tcausa=false;
    res=true;
    sigue=true;
    esAnd=true;
    var1[0]=0;
    var2[0]=0;
  }
};
class MqttDesencadenador
{
  public:  
  char expresion[MAXSTRDESEN];//"{1}=1 -> !{2} " 
  bool activo;//se desactivan automaticamente cuando se cumple la condicion y se vuelve activar cuando deja de cumplirse

  MqttDesencadenador();
  
  bool Exe(MqttVarManager *vars);

  //auxiliar----------------
  void procesaVar(MqttExeParam *p);//recoge expresion de variable o float
  void procesaOper(MqttExeParam *p);//recoge operador

  MQTTvalor GetVarValue(char*ivar, MqttVarManager *vars);
  int GetIvar(char*ivar);
  MqttVar* GetVar(char*ivar, MqttVarManager *vars);
  int GetElementosOper( char *oper);
  
  bool Eval(MqttVarManager *vars,  char *oper, char*x, char*y);//evalua operador

  void ExeEfecto(MqttVarManager *vars,  char *oper, char*x, char*y);//ejecuta efecto

  float GetValue(char *ivar, MqttVarManager *vars);
};

class MqttDesencadenadorArray
{
  public:
  MqttDesencadenador data[MAXDESEN];
  int n;

  
  MqttDesencadenadorArray();

  MqttDesencadenador* Get(int i);
  
  int Add(MqttDesencadenador* var);
  
};
//falta acciones y efectos
//acciones tienen valor, tipo y ivar(indice a variable)
class MqttDesencadenadorManager: public MqttOnVarChangeListenner
{
  public:
  MqttVarManager *vars;
  //byte ivars[24];
  int nv;
  MqttDesencadenadorArray des;
  bool revisa;
  MqttDesencadenadorManager();

    //-------------------
  
  void inicia( MqttVarManager *vars);//inicia variables si hace falta
  void Suscribe();//subscribe variables a mqtt
  int OnMqtt(char* topic, char* payload);//entra trama mqtt devuelve indice a sensor cambiado
  void loop();//publica datos variables

  //add------------
  void AddDes(char *expresion);


  virtual void OnVarChange(int ivar);

  void  RevisaDesencadenadores();
  
};
/*
 * 
 */
 #endif
