#ifndef ALARM_CONTROL_H
#define ALARM_CONTROL_H
#include "sqlite3.h"
#include <pthread.h>
#include <stdint.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

#include "alarm_define.h"
#ifdef EN_ACCIDENT
#include "../accident/accident.h"
#endif
/*
1. 告警处理为异步操作, 只能记录触发告警的点位,对于额外信息中的数据无法生成快照.
2. 告警字符串,额外信息为空时,json为"(null)", webUI无影响,云平台待测试
3. automatic 注册的点位待测试

*/

typedef struct alarm_control_t
{
    void*  db;                      // sqlite3 || taos
    hash_intptr_t* alarm_tag_hash;  // key dev_no_tag
    hash_intptr_t* alarm_info_hash; // key type.vendor.model.tag
    hash_intptr_t* alarm_code_hash; // key alarmCode.reasonCode
    hash_intptr_t* alarm_cond_ce_hash; // key dev_tag_name

    // 实时告警链表
    list_head_t     alarm_real_list; 
    pthread_mutex_t alarm_real_list_mutex;
    int             alarm_real_list_size;
    int             alarm_real_list_max_size;

    // 屏蔽告警链表 todo 优化为set
    list_head_t alarm_forbidden_list;
    pthread_mutex_t alarm_forbidden_list_mutex;
    int             alarm_forbidden_list_size;
    int             alarm_forbidden_list_max_size;

    bool need_report;
}alarm_control_t;

// 初始化告警控制模块 入口
int init_alarm_control_task();
int alarm_control_destory(alarm_control_t* alarm_control);

// 设置是否上报,由当前的mqtt状态决定 
void set_alarm_need_report(bool status);


// 获取告警信息 alarmcode and reasoncode
alarm_info_t* get_alarm_info_by_code(int alarmCode, int reasonCode);

// 队列操作

int push_alarm_real_to_queue(alarm_real_t* real);

alarm_report_t* create_alarm_report_node(alarm_real_t* alarm_real);

    // 获取告警信息
int get_alarm_string(struct lnxall_buff* lbuf, int type);
struct alarm_history_buf* get_alarm_history_data(int jump, int num);

// 屏蔽告警信息
int add_forbidden_alarm_code(int* alarm_code, int size);
int del_forbidden_alarm_code(int* alarm_code, int size);

// 给单个测点注册告警信息
int register_alarm_by_tag(tag_t* tag, alarm_info_cond_t* info);
// 注册告警信息, [dev_type] 所有的设备都会注册这个告警 
int register_alarm_tags(char* dev_type, alarm_info_cond_t* info);
// 从文件中注册告警点, json格式在函数实现里
int register_alarm_tag_from_file(char* file_name);

// 注册IO保护告警信息
int register_ems_io_protect_alarm(alarm_condition_list* register_alarm_param);
// 注册用户告警信息
int register_alarm_with_info(tag_t* tag, ALARM_CONDITION condition, int value, int alarm_code, int reason_code, char* params);
int register_ems_user_define_alarm_with_info(alarm_condition_list* register_alarm_param, int alarm_code, int reason_code, char** params, int num);
int register_ems_device_alarm(alarm_condition_list* register_alarm_param);
// 注册用户自定义告警信息
int register_ems_user_define_alarm(alarm_condition_list* register_alarm_param, int alarm_code_src, int ems_alarm_level);
// 手动恢复告警
int delete_alarm_by_code(char* dev_no, int alarm_code, int reason_code);
int delete_alarm_by_tag(char* dev_tag_name);
#endif // ALARM_CONTROL_H
