/*
* @fileName alarm_database.h
* @author gaoyang
* @date 2025-01-15 13:55
* @description 
*/
#ifndef _ALARM_DATABASE_H
#define _ALARM_DATABASE_H

#include <stdint.h>

#define ALARM_REAL_TAB  "alarmRealTab"
#define SQLITE3_DB_PATH "/app/database/opcalarm.db"
#define ALARM_DB_NAME   "opcalarm"

#define CREATE_ALARM_HISTORY_DB "CREATE DATABASE IF NOT EXISTS %s"

#define TDENGINE_CREATE_ALARM_TAB_SQL "CREATE TABLE IF NOT EXISTS alarmRealTab (" \
                                      "raise_time        TIMESTAMP, "             \
                                      "recovery_time     BIGINT UNSIGNED,"        \
                                      "alarm_code        INT,"                    \
                                      "reason_code       INT,"                    \
                                      "entity            VARCHAR(64),"            \
                                      "tagname           VARCHAR(96),"            \
                                      "addition          VARCHAR(64),"            \
                                      "status            TINYINT);"

#define SQLITE_CREATE_ALARM_TAB_SQL "CREATE TABLE IF NOT EXISTS alarmRealTab (" \
                                    "raise_time        BIGINT UNSIGNED, "       \
                                    "recovery_time     BIGINT UNSIGNED,"        \
                                    "alarm_code        INT,"                    \
                                    "reason_code       INT,"                    \
                                    "entity            TEXT(64),"               \
                                    "tagname           TEXT(96),"            \
                                    "addition          TEXT(64),"               \
                                    "status            TINYINT);"

#define ALARM_REAL_TAB_NUM_COLUMN 8
#define NO_VALUE "(null)"

#define INSERT_ALARM_SQL "INSERT INTO alarmRealTab VALUES(%"PRIu64", %"PRIu64", %d, %d, '%s', '%s','%s', %d)"

#define UPDATE_ALARM_SQL "UPDATE alarmRealTab SET recovery_time = %"PRIu64", status = %d WHERE alarm_code = %d AND reason_code = %d AND status = %d AND raise_time = %"PRIu64""

#define ALARM_HISTORY_GET_TO_UA "SELECT * FROM alarmRealTab WHERE status = 0 " \
                                "ORDER BY raise_time DESC "                   \
                                "LIMIT %d OFFSET %d;"

#define GET_ALARM_REAL_FROM_DB "SELECT * FROM alarmRealTab WHERE status = 1"

#define ALARM_HISTORY_NUM_GET "SELECT COUNT(*) FROM alarmRealTab WHERE status = 0;"



// 保留最近10000条报警记录
#define TAOS_GET_DEL_HISTORY_TIME "SELECT raise_time FROM alarmrealtab ORDER BY raise_time DESC LIMIT 1 OFFSET %d;"
#define TAOS_DEL_HISTORY_SQL "DELETE FROM alarmrealtab WHERE raise_time < %"PRIu64";"

#define ALARM_HISTORY_DELETE_SQL "DELETE FROM alarmRealTab WHERE raise_time NOT IN (SELECT raise_time FROM alarmRealTab ORDER BY raise_time DESC LIMIT %d);"

// 根据reaise_time排序,只保留10000条报警记录
// db
typedef struct alarm_db_t
{
    uint64_t raise_time;
    uint64_t recovery_time;
    int      alarm_code;
    int      reason_code;
    char*    entity;
    char*    dev_tag_name;
    char*    addition;
    int      status;
} alarm_db_t;

typedef struct alarm_real_t alarm_real_t;

// 初始化数据库
int init_alarm_db(void** db);
// 关闭数据库
int close_alarm_db(void** db);
// 查询所有未恢复的报警
void get_all_real_alarm_from_db();
// 将报警信息写入数据库
int flush_alarm_db_to_database(alarm_db_t* alarm);
// 数据库中报警状态切换至已恢复
int  recovery_alarm_to_db(alarm_real_t* alarm);
//
void delete_staledated_alarm(int count);
#endif
