#ifndef __APP_TUYA_ZIGBEE_H_
#define __APP_TUYA_ZIGBEE_H_

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



/* 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_WAKEUP,
    APP_TUYA_EVT_SLEEP,
    APP_TUYA_EVT_STOP,
    APP_TUYA_EVT_INIT_SUCCESS,
    APP_TUYA_EVT_INIT_FAIL,
    APP_TUYA_EVT_NETWORK_STATUS_SUCCESS,
    APP_TUYA_EVT_NETWORK_STATUS_FAIL,
    APP_TUYA_EVT_RESET,
    APP_TUYA_EVT_SYNC_CLOCK_TIME,
    APP_TUYA_EVT_SYNC_CLOCK_TIME_FAIL,
} 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;
    uint16_t sync_clock_time_seq;

    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_network_status(app_tuya_t *p_app, uint8_t network_status_value);
uint32_t app_tuya_sync_clock_time(app_tuya_t *p_app, uint32_t time, uint32_t local_time);

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_ZIGBEE_H_ */
