/*#if ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif*/
#ifndef MqttvarManagerDef
#define MqttvarManagerDef 1

#define MAXTOPICVAR  24//maximo de caracteres de los topic de las variables
#define MAXTVARARRAY  64//maximo de variables que puede contener el amqttvarArray

class PubSubClient;
//array de topic
class MqttTopicAttay
{
  public:
    char str[1024];//topic de mqtt asociado
    int ind[32];
    int nst;
    int n;
    MqttTopicAttay();

    char* Get(int i);
    int Get(char *topic);
    int Add(char *topic);
  
};

union MQTTvalor
{
    float f;    
    byte i; 
}; 

class MqttVar
{
  public:
  enum TipoFlags//indica el tipo de sensor
  {
      OUT_VAR=0x01,//variable de salida (acepta set)
      IN_VAR=0x02,//variable de entrada (publica get)
      PRIV_VAR=0x04,//variable privada de entrada (acepta get como si fueran set)
      FLOAT_VAR=0x08,
      ACCION_VAR=0x10,//variable de accion (publica  en cada cambio)
     
  };
  
  public:
  //generales---------------------------------------------------------------------
  byte flags;
  MQTTvalor val;//valor de la variable (tiene que ser union porque puede ser double)
  byte topic;//topic de mqtt asociado

  MqttVar();
};


//array de variables--------------------------------------------------------------
class MqttVarArray
{
  public:
  MqttVar data[64];//array de variables
  int n;
  
  
  MqttVarArray();

  MqttVar* Get(int i);
  
  MqttVar* GetVar(int itopic);

  int Add(MqttVar* var);
  
   
};

//manager de variables------------------------------------------------------
class MqttVarManager
{
  public:

  MqttVarArray* vars;//variables mqtt
  MqttTopicAttay* topics;
  PubSubClient* client_qqtt;//cliente mqtt

  unsigned long  tiempo_var;
  unsigned long incre_tvar;
  
  MqttVarManager();
  void config(MqttVarArray *vArray, MqttTopicAttay* t);

  void inicia(PubSubClient* client_qqtt);//subscribe variables a mqtt
  int OnMqtt(char* topic, char* payload);//entra trama mqtt devuelve indice a sensor cambiado
  void loop();//publica datos variables
  
  
  //funciones auxiliares----------------------------
  MqttVar* Get(int i);
  
  int AddVar(byte flags, char*topic);
  void PublicaVars();

  void OnChange(int ivar);
};
/*
//clase de relacciones/operaciones************************************************
class MqttOper
{
  public:
  byte x;//indice a variable 1
  byte y;//indice a variable 2
  byte oper;
    
  MqttOper();
  
  bool Test(MqttVarArray* vars);
  
};

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

  
  MqttVarArray();

  MqttOper* Get(int i);
  bool test(int *i);
  
  int Add(MqttRelaccion* var);
  
};

class MqttCausa
{
  public:
  byte ini;//indice a primer oper
  byte n;//numero de operadores totales
  byte tipo;//tipo de causa (and or ...)

  MqttCausa();
  
  bool test(MqttOperArray *i);
  
};

class MqttAccion
{
  public:
  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 ...)

  MqttAccion();
  
  bool test(MqttOperArray *i);
  
};


//falta acciones y efectos
//acciones tienen valor, tipo y ivar(indice a variable)
class MqttDesencadenadorManager
{
  public:
  MqttDesencadenadorManager();
};

/*
*/
#endif
