/**
 * @file    com_router.h
 * @brief   通信路由中枢 — 通道管理 + 端口转发 + 收发桥接
 *
 * @details 本模块负责:
 *          1. 通道管理 — 创建/连接/状态回调 (串口 + TCP 服务端)
 *          2. 端口转发 — TCP 端口 → 串口/通道 的数据透传
 *          3. 协议路由 — 串口接收数据分发给 self_ptl/IEC + 回复归属
 *          4. 收发桥接 — self_ptl/IEC 的 MQ 队列 ↔ 物理通道
 *
 *          配置来源: config/CHANNEL/channel_cfg.json
 */

#ifndef _COM_ROUTER_H_
#define _COM_ROUTER_H_

#include "myBase.h"
#include "myComm.h"

#ifdef __cplusplus
extern "C" {
#endif

/* =========================== 协议分发回调 =========================== */

#define MAX_DISPATCH_APPS 8

/**
 * @brief 协议模块数据接收回调 — 通道绑定 bind_app 后, 整帧投递
 * @param interface  通道标识 (ch_id<<16)|fd
 * @param data       原始数据 (整帧, 不解包)
 * @param len        数据长度
 */
typedef void (*com_router_dispatch_cb)(uint32_t interface, const unsigned char *data, int len);

/* =========================== 通道配置结构 =========================== */

/**
 * @brief 通道运行时信息
 * @field key       通道标识 "serial:0" / "tcp_s:0"
 * @field bind_app  绑定应用: "self_ptl" / "iec" / "" (未绑定)
 * @field type      通道类型 enum_comm_type
 * @field id        comm_create 返回值
 * @field socket_fd 当前连接 fd, -1 表示未连接
 * @field interface (id << 16) | socket_fd, 供 IEC 做多实例判别
 */
typedef struct
{
	char                key[32];
	char                bind_app[16];
	int                 type;
	union_comm_para     para;

	/* 运行时字段 */
	int                 id;
	int                 socket_fd;
	uint32_t            interface;
} com_channel_t;

/**
 * @brief 端口转发规则 — 一个监听端口 → 一个目标通道
 * @field listen_ip      监听 IP
 * @field listen_port    监听端口
 * @field target_channel 目标通道 key (如 "serial_ftu")
 * @field listen_ch_id   运行时: libcomm 通道 id (TCP server)
 * @field sock_fd        运行时: accept 的 client fd, -1 表示无客户端
 * @field target_ch_id   运行时: 目标通道的 libcomm id
 */
typedef struct
{
	char        listen_ip[32];
	int         listen_port;
	char        target_channel[32];

	/* 运行时字段 */
	int         listen_ch_id;
	int         sock_fd;
	int         target_ch_id;
} com_forward_rule_t;

/* =========================== 配置加载 =========================== */

int com_router_config_load(const char *json_path);

/* =========================== 查询 API =========================== */

uint32_t  com_router_interface_get(const char *key);
int       com_router_fd_get(const char *key);
int       com_router_id_get_by_bind(const char *bind_app);

/**
 * @brief 协议模块注册分发回调 — 通道 bind_app 匹配时直接投递
 * @param bind_app 协议标识 (如 "iec", "self_ptl", "iec61850")
 * @param cb       数据接收回调, 通道收到数据时调用
 * @return 0 成功, -1 失败 (表满)
 *
 * @note 调用时机: app_wiring() 中, 在 app_com_router_init1 之后
 *       若通道配置中 bind_app 非空, 该通道的原始数据直接投递给注册的回调
 *       不再经过帧内容分路逻辑 (帧解析由协议模块自行完成)
 */
int com_router_register_dispatch(const char *bind_app, com_router_dispatch_cb cb);

/* =========================== 应用线程入口 =========================== */

int   app_com_router_init1(void *arg);
int   app_com_router_init2(void *arg);
void *app_com_router(void *arg);

#ifdef __cplusplus
}
#endif

#endif /* _COM_ROUTER_H_ */
