%%%-------------------------------------------------------------------
%%% @author licheng5
%%% @copyright (C) 2023, <COMPANY>
%%% @doc
%%%
%%% @end
%%% Created : 14. 2月 2023 19:48
%%%-------------------------------------------------------------------
-author("licheng5").

%% 主机是否在线
-define(HOST_OFFLINE, 0).
-define(HOST_ONLINE, 1).
-define(HOST_NOT_JOINED, -1).

%% 设备是否在线状态
-define(DEVICE_OFFLINE, 0).
-define(DEVICE_ONLINE, 1).
-define(DEVICE_NOT_JOINED, -1).

%% 下发的任务状态
-define(TASK_STATUS_INIT,   -1).  %% 未接入
-define(TASK_STATUS_FAILED, 0).    %% 离线
-define(TASK_STATUS_OK,     1).     %% 在线

%% 主机端上报数据类型标识
%% 建立到websocket的register关系
-define(METHOD_AUTH, 16#00).
-define(METHOD_CREATE_SESSION, 16#01).

-define(METHOD_DATA, 16#02).
-define(METHOD_PING, 16#03).
-define(METHOD_INFORM, 16#04).
-define(METHOD_FEEDBACK_STEP, 16#05).
-define(METHOD_FEEDBACK_RESULT, 16#06).
-define(METHOD_EVENT, 16#07).
%% ai识别的事件上报
-define(METHOD_AI_EVENT, 16#08).

%% 消息体类型
-define(PACKET_REQUEST, 16#01).
-define(PACKET_RESPONSE, 16#02).
%% 服务器端推送消息
-define(PACKET_PUBLISH, 16#03).
-define(PACKET_PUBLISH_RESPONSE, 16#04).

%% 事件类型
-define(EVENT_DEVICE, 16#01).
%% 主机的相关事件
-define(EVENT_HOST, 16#02).

%% ai相关的事件
-define(EVENT_AI, 16#03).

%% 指令相关
-define(DIRECTIVE_ZD_CTRL, 16#01).

%% 缓存数据库表
-record(kv, {
    key :: binary(),
    val :: binary() | list() | map() | sets:set(),
    expire_at = 0 :: integer(),
    type :: atom()
}).

%% id生成器
-record(id_generator, {
    tab :: atom(),
    increment_id = 0 :: integer()
}).

%% 统计项
-record(option, {
    success_num = 0,
    fail_num = 0
}).

%% 统计累加器
-record(totalizator, {
    key :: {SceneId :: integer(), Date :: calendar:date()},
    scene_id :: integer(),
    date :: calendar:date(),
    option :: #option{}
}).

%% 北向数据
-record(north_data, {
    id = 0 :: integer(),
    location_code :: binary(),
    dynamic_location_code :: binary(),
    %% 数据库类型的endpoint， 可以返回list: [{K, V}, {K1, V1}]
    fields :: [{K :: binary(), V :: any()}],
    timestamp = 0 :: integer()
}).

%% 事件相关的数据
-record(event_data, {
    id = 0 :: integer(),
    location_code :: binary(),
    dynamic_location_code :: binary(),
    event_type :: integer(),
    params :: map()
}).

%% 设备数据
-record(device_data, {
    tags :: map(),
    val :: any(),
    timestamp :: integer()
}).