//
// Created by WJG on 2020-5-11.
//

#ifndef MGCORE_MGBUSINTERFACE_H
#define MGCORE_MGBUSINTERFACE_H

#include <stdint.h>
#include <vector>
#include "../JECossServer.h"
#include "../service/DeviceStatusService.h"

using namespace std;

/*****************************************************************************
 定义 名  : MSG_PROC_CALLBACK
 功能描述  : 各模块消息处理模块函数，通过reg_msg_proc_callback注册，有消息时被调用
 输入参数  : msg：待处理消息；len:消息长度；
 返 回 值  : 无
*****************************************************************************/
typedef void (*MSG_PROC_CALLBACK)(const string &msg);

/*****************************************************************************
 函 数 名  : msg_bus_start
 功能描述  : 启动消息管理模块
 输入参数  : needMultiThreading：是否需要多线程支持，true-需要，false-不需要；
 返 回 值  : 0：成功； -1：失败； 1：已经启动；
 说    明  : 如果需要多线程支持，则MgBus会有多个线程分别调用MSG_PROC_CALLBACK处理消息，
             MSG_PROC_CALLBACK内部应对相关资源做好互斥；
             如果不需要多线程支持，则MgBus只有一个线程调用MSG_PROC_CALLBACK处理消息，
             MSG_PROC_CALLBACK应尽快对消息进行处理，避免线程阻塞。
*****************************************************************************/
int msg_manager_start(bool needMultiThreading);

/*****************************************************************************
 函 数 名  : msg_bus_stop
 功能描述  : 停止消息管理模块
 输入参数  : 无
 返 回 值  : 五
*****************************************************************************/
void msg_manager_stop();

/*****************************************************************************
 函 数 名  : msg_put_bus
 功能描述  : 将消息放入MgBus，之后由MgBus将消息发送至目的地进行处理
// 输入参数  : source：消息源；target：消息目的地；msg：要发送的消息；
 输入参数  : sourceModule：消息源模块名；targetModule：消息目的模块名；msg：要发送的消息；
 返 回 值  : 消息放入结果,0:成功，非0失败
*****************************************************************************/
int msg_put_in(const string &sourceModule, const string &targetMoudle, const string &msg);

/*****************************************************************************
 函 数 名  : reg_msg_proc_callback
 功能描述  : 各模块向MgBus注册消息处理回调函数
//输入参数  : mode：模块id；func：MSG_PROC_CALLBACK回调函数；
 输入参数  : moduleName：模块名；func：MSG_PROC_CALLBACK回调函数；
 返 回 值  : 无
*****************************************************************************/
int reg_msg_proc_callback(const string &moduleName, MSG_PROC_CALLBACK func);

void set_post_handler(jedge::DeviceStatusService *jdss);

int msg_post_in(const string &mod, const string &uri, qlibc::QData &data);

int msg_post_in_res(const string &mod, const string &uri, qlibc::QData &data, qlibc::QData &resp);

#endif //MGCORE_MGBUSINTERFACE_H
