/*#if ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif*/
#ifndef MqttvarManagerDef
#define MqttvarManagerDef 1
#include "MqttDefines.h"
#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,//variable en coma flotante
      ACCION_VAR=0x10,//variable de accion (publica  en cada cambio)
      VOLATILE_VAR=0x20 //marca variable que una vez revisada se cambia internamente su valor (usado en desencadenadores para variables de accion)
     
  };
  
  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);
  
   
};

class MqttOnVarChangeListenner;
//manager de variables------------------------------------------------------
class MqttVarManager
{
  MqttVarArray _v;
  MqttTopicAttay _t;
  MqttOnVarChangeListenner* onChangeListener[2];
  int nListenner;
  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=NULL, MqttTopicAttay* t=NULL);
  void SetTimeRefres(int seg);

  void inicia(PubSubClient *client_qqtt);//inicia variables si hace falta
  void Suscribe();//subscribe variables a mqtt
  void OnMqtt(char* topic, char* payload);//entra trama mqtt devuelve indice a sensor cambiado
  void loop();//publica datos variables
  
  
  //funciones auxiliares----------------------------
  void AddListenner(MqttOnVarChangeListenner *pOnChangeListener);
  MqttVar* Get(int i);
  int GetId(char* topic);//devuelve el id de una variable
  
  int AddVar(byte flags, char*topic);
  int AddInternalVarFloat( char*topic);
  int AddInternalVarInt( char*topic);
  void PublicaVars();
  void PublicaVar(int ivar);
  void OnChange(int ivar);

  void ResetVolatileVar();
  void InvierteVar(int ivar);
  void SetVal(int ivar,MQTTvalor val);
};

/*
*/
#endif
