
#ifndef MqttDesencadenadorManagerDef
#define MqttDesencadenadorManagerDef 1
#include <SPI.h>
#include "MqttDefines.h"
#include "MqttVarManager.h"
//clase de relacciones/operaciones************************************************
class MqttOper
{
  //
  public:
  enum TipoOperacion
  {
    Igual_val_oper,
    Menor_val_oper,
    Mayor_val_oper,
  };
  byte x;//indice a variable 1
  byte y;//indice a variable 2
  MQTTvalor val;
  byte oper;//tipo de operacion
    
  MqttOper();
  
  bool Test(MqttVarManager* vars);
  
};

//array de operaciones--------------------------------------------------------------
class MqttOperArray
{
  public:
  MqttOper data[32];
  int n;

  
  MqttOperArray();

  MqttOper* Get(int i);
  
  int Add(MqttOper* var);
  
};

class MqttCausa
{
  public:
  enum TipoCausa
  {
      AND_CAUSA=1,
      OR_CAUSA,
  };
  byte ini;//indice a primer oper
  byte n;//numero de operadores totales
  byte tipo;//tipo de causa (and or ...)

  MqttCausa();
  
  bool Test(MqttVarManager *i);
  
};

class MqttCausaArray
{
  public:
  MqttCausa data[16];
  int n;
  MqttCausaArray();
  
  
  MqttCausa* Get(int i);
  
  int Add(MqttCausa* var);;
  
};

class MqttCausaManager
{
  public:
  MqttCausaArray caus;
  MqttOperArray oper;
  MqttCausaManager();
  bool IsTrue(int icau, MqttVarManager *vars);
  int AddCausa(byte tipo);
  int AddEfecto(int icau,byte tipo, int ivar,  MQTTvalor *val);
    
};

class MqttEfecto
{
  public:
  enum TipoEfecto
  {
    InvierteValVar=1,//invierte valor a variable
    SetValVar//setea el valor asignado en el efecto a la variable
  };
  
  MQTTvalor val;
  byte ia;//indice externo (dependiendo del tipo puede ser a una variable o topic o sensor ...)
  byte tipo;//tipo de accion (and or ...)
  

  MqttEfecto();
  
  void Exe(MqttVarManager *i);
  
};

class MqttEfectoArray
{
  public:
  MqttEfecto data[16];
  int n;

  
  MqttEfectoArray();

  MqttEfecto* Get(int i);
  
  int Add(MqttEfecto* var);
  
};


class MqttDesencadenador
{
  public:  
  MQTTvalor val;
  byte ie;//indice a efecto
  byte ic;//indice a causa 
  byte ne;//numero de efectos total
  

  MqttDesencadenador();
  
  void Exe(MqttVarManager *i,  MqttEfectoArray *act, MqttCausaManager* caus);
};

class MqttDesencadenadorArray
{
  public:
  MqttDesencadenador data[16];
  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;
  MqttEfectoArray efec;
  MqttCausaManager caus;
  MqttDesencadenadorArray des;
  bool revisa;
  MqttDesencadenadorManager();

  //add---------------------
  int addDesencadenador(byte tipoCausa);
  int addEfecto(int ides,byte tipo, char *topic);//añade efecto al desencadenador (devuelve id efecto)
  int addOperCausaI(int ides, char *topic, byte tipo, byte val );
  int addOperCausaF(int ides, char *topic, int tipo, float val );
  //-------------------
  
  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



  virtual void OnVarChange(int ivar);



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