#ifndef __APP_TUYA_H_
#define __APP_TUYA_H_

#include <stdint.h>
#include "fsm.h"
#include "app_timer.h"

#ifdef APP_TUYA_MODE_GENERAL
#include "tuya_general.h"
#else /* APP_TUYA_MODE_GENERAL */
#ifdef APP_TUYA_MODE_ZIGBEE
#include "tuya_zigbee.h"
#else /* APP_TUYA_MODE_ZIGBEE */
#include "tuya.h"
#endif /* APP_TUYA_MODE_ZIGBEE */
#endif /* APP_TUYA_MODE_GENERAL */



/* macro to create application level app_curtain_motor_server_t context */
#define APP_TUYA_DEF(_name, _evt_cb, _dp_set_cb) \
    APP_TIMER_DEF(_name ## _timer); \
    static app_tuya_t _name = \
    { \
        .p_timer_id = &_name ## _timer, \
        .evt_cb = _evt_cb, \
        .dp_set_cb = _dp_set_cb, \
    }



typedef enum app_tuya_evt_e {
    APP_TUYA_EVT_STOP,
    APP_TUYA_EVT_INIT_SUCCESS,
    APP_TUYA_EVT_INIT_FAIL,
    APP_TUYA_EVT_HEARTBEAT_SUCCESS,
    APP_TUYA_EVT_HEARTBEAT_FAIL,
    APP_TUYA_EVT_WIFI_STATE_SUCCESS,
    APP_TUYA_EVT_WIFI_STATE_FAIL,
    APP_TUYA_EVT_RESET,
} app_tuya_evt_t;


/* forward declaration */
typedef struct app_tuya_s app_tuya_t;


/* application state set callback prototype */
typedef void (*app_tuya_evt_cb_t)(app_tuya_t *p_app, app_tuya_evt_t evt);
typedef void (*app_tuya_dp_set_cb_t)(app_tuya_t *p_app, const tuya_msg_dp_t *p_dp_msg);


/* application tuya structure */
struct app_tuya_s {
    const app_timer_id_t *p_timer_id;

    int initialization_cnt;
    bool wait_heartbeat_ack;

    fsm_t fsm;

    app_tuya_evt_cb_t evt_cb;
    app_tuya_dp_set_cb_t dp_set_cb;
};



/*** Interface functions */

uint32_t app_tuya_init(app_tuya_t *p_app);
uint32_t app_tuya_start(app_tuya_t *p_app);
uint32_t app_tuya_query_state(app_tuya_t *p_app);
uint32_t app_tuya_wifi_state(app_tuya_t *p_app, uint8_t wifi_state_value);

uint32_t app_tuya_set_dp_bool(app_tuya_t *p_app, uint8_t dpid, bool value);
uint32_t app_tuya_set_dp_enum(app_tuya_t *p_app, uint8_t dpid, uint8_t value);
uint32_t app_tuya_set_dp_uint8(app_tuya_t *p_app, uint8_t dpid, uint8_t value);
uint32_t app_tuya_set_dp_uint16(app_tuya_t *p_app, uint8_t dpid, uint16_t value);
uint32_t app_tuya_set_dp_uint32(app_tuya_t *p_app, uint8_t dpid, uint32_t value);



#endif /* __APP_TUYA_H_ */
