#ifndef __UPGRADE_H
#define __UPGRADE_H
#include <time.h>
#include "dy_utils/dy_common.h"
#include "ipc_session.h"
#include "dy_utils/dy_pp.h"
#include "dy_utils/dy_ipc.h"
#include "dy_utils/hash_intptr.h"

#define UPGRADE_TASK_MAX 1
//#define UPGRADE_BLOCK_LEN 100
#define MAX_FIRMWARE_SIZE (256 * 1024)

#define DEV_PATCH_MAX 8 //每个设备补包数
#define DEV_NOACK_MAX 6 //每个设备没应答重试数


#define NODE_UPGRADE_CMD_TIMEOUT 20 //发送的升级指令超时时间，超过这个时间将重发

#define START_UPGRADE_MI 999
#define SEND_BLOCK_MI 1000
#define SEND_CHK_MI 997

#define NODE_PRAME_FILE   "/app/node_upgrade_param.json"
#define APP_MANAGER_CFG   "/app/config/app_manager_cfg.json"


typedef enum
{
    UPGRADE_GW_DOWNLOAD_FAIL = 301,
    UPGRADE_GW_CHECK_FAIL,
    UPGRADE_GW_EXTRACT,
    UPGRADE_GW_ALREADY_RUN,
    UPGRADE_GW_NOT_SUPPORT,
    UPGRADE_GW_INTERNAL_ERR,
    UPGRADE_GW_FILENAME_INVALID,
} upgrade_gw_code;

typedef enum
{
    UPGRADE_TERM_UPGRADE_READY = 0,
    UPGRADE_TERM_DOWNLOAD_FAIL = 401,
    UPGRADE_TERM_CHECK_FAIL,
    UPGRADE_TERM_NO_ONLINE_DEV,
    UPGRADE_TERM_UPGRADE_TIMEOUT,
    UPGRADE_TERM_EXECUTE_UPGRADE,
    UPGRADE_TERM_INIT_DEV_STATE_FAIL,
    UPGRADE_TERM_READ_FIRMWARE_FAIL,
    UPGRADE_TERM_CUT_BLOCK_FAIL,
    UPGRADE_TERM_SEND_START_FAIL,
    UPGRADE_TERM_SEND_BLOCK_FAIL,
    UPGRADE_TERM_ALREADY_RUN,
    UPGRADE_TERM_PARSE_FAILED,
    UPGRADE_TERM_UPGRADE_ABORT,
    UPGRADE_TERM_INTERNAL_FAULT,
    UPGRADE_TERM_UPGRADE_DONE,
} upgrade_term_code;


//gateway升级类型
enum update_step
{
    UPGRADE_GW_MODE_FIRMWARE,
    UPGRADE_GW_MODE_IPK,
};

//gateway升级参数
typedef struct
{
    int mi;
    char URL[512];
    char md5sum[256];
    int timeout;
    time_t begin_time;
    char mode[16];
} upgrade_gw_args_t;

// 升级模块状态
typedef enum
{
	UPGRADE_IDLE,
	UPGRADING_GW,	 // 升级网关
	UPGRADING_APP,   // opkg升级APP
    UPGRADING_NODE,  // 下挂设备升级中
} upgrade_state_t;

typedef struct _app_manager_config_s 
{
	struct list_head list;
	app_config_t app_cfg;
	time_t last_send;
} app_manager_config_t;

typedef struct _upgrade_var_s
{
	struct list_head config_list;
    ipc_session_t* session; //内部broker的MQTT session，用于进程间通信
    nodes_cfg_table_t *nodes_cfg_table; //节点信息
    template_table_t *template_table; //模板信息
    char sn_str[SN_MAX_LEN];
    char proc_name[PROGRAM_NAME_LEN];
    upgrade_state_t state; // 升级状态
    int check_timer;
    struct hash_intptr *ipk_blacklist_hash;
} upgrade_var_t;

void msg_upgrade_node(upgrade_var_t *var, ipc_msg_t *mqtt_msg);
void msg_upgrade_requst_apps_list(upgrade_var_t *var, ipc_msg_t *mqtt_msg);
int msg_upgrade_app_install(upgrade_var_t *var, ipc_msg_t *mqtt_msg);
int msg_upgrade_app_remove(upgrade_var_t *var, ipc_msg_t *mqtt_msg);
extern void msg_upgrade_gw(upgrade_var_t *var, ipc_msg_t *mqtt_msg);
int app_manager_load_config(upgrade_var_t *var, char *file);
int msg_upgrade_depend_app_install(upgrade_var_t *var, ipc_msg_t *mqtt_msg);
int msg_upgrade_depend_app_remove(upgrade_var_t *var, ipc_msg_t *mqtt_msg);
int app_manager_install(upgrade_var_t *var, app_manager_config_t *app_manager_cfg);


#endif /* __UPGRADE_H */
