/********************************************************************************
 * @file       net_interface.h
 * @brief      网络接口抽象层统一头文件
 * @details    定义跨平台网络接口的统一抽象标准，支持ETH/ES双接口无缝切换，提供数据收发、队列管理、接口注册、端口绑定等核心能力，所有同步机制完全封装隐藏
 * @copyright  Copyright (C) 2026 芯祥联科技 All rights reserved.
 * @website    www.xxltech.cn
 * @email      hezuo@xxltech.cn
 * @author     芯祥联科技研发部
 * @version    V1.0.0
 * @date       2026-01-09
 * @note       1. 已彻底移除所有SNMP相关命名残留，错误码统一使用标准NetErr枚举类型
 *             2. 接口设计完全遵循平台无关性原则，适配Win32/Linux/STM32等主流平台
 *             3. 编译依赖基础类型头文件type.h、平台驱动接口头文件platform.h
 ********************************************************************************/
#ifndef NET_INTERFACE_H
#define NET_INTERFACE_H

#include "type.h"          // 基础类型（uint8/uint32等）

#ifdef __cplusplus
extern "C" {
#endif

#define MAX_MSG_LEN 1024
#define API_IP_LEN 16  
// 套接字类型
typedef int32_xxl PlatformSocket;
#define PLATFORM_SOCKET_INVALID -1

// ===================== 标准枚举错误码 无任何SNMP残留 =====================
typedef enum
{
    NET_OK           = 0,    // 操作执行成功
    NET_ERR_PARAM    = -1,   // 传入参数非法/无效
    NET_ERR_TIMEOUT  = -2,   // 操作超时无响应
    NET_ERR_NETWORK  = -3,   // 网络通信异常/收发失败
    NET_ERR_MEM      = -4,   // 内存分配失败/内存不足
    NET_ERR_RESOURCE = -5,   // 系统资源耗尽(如队列满)
    NET_ERR_INIT     = -6,   // 模块初始化失败
    NET_ERR_EMPTY    = -7,   // 数据队列为空无数据可取
    NET_ERR_IFACE    = -8,   // 网络接口未注册/接口无效
    NET_ERR_PORT     = -9,   // 端口被占用/端口绑定失败
    NET_ERR_NOT_SUPPORT = -10,// 接口/操作暂不支持（预留接口专用）
} NetErr;

// 网络接口类型（业务枚举，无实现细节）
typedef enum {
    NET_IFACE_ETH = 0,
    NET_IFACE_ES,
    NET_IFACE_MAX
} NetInterfaceType;

// 接收数据节点（仅暴露业务字段，无同步机制）
typedef struct NetRecvNode {
    uint8_xxl data[MAX_MSG_LEN];
    uint32_xxl len;
    char_xxl src_ip[API_IP_LEN];
    uint16_xxl src_port;
} NetRecvNode;  // 注意：移除链表指针，上层无需关心节点关系

// 网络接口抽象（函数指针封装所有细节）
typedef struct {
    NetInterfaceType type;
    NetErr (*net_send)(const char* ip, uint16_xxl port, const uint8_xxl* data, uint32_xxl len);
    NetErr (*net_recv)(uint8_xxl* buf, uint32_xxl buf_len, uint32_xxl* recv_len, char* src_ip, uint16_xxl* src_port);
    void (*destroy)(void);
    uint16_xxl local_port;
} NetInterface;

// 接收回调函数
typedef void (*NetRecvCallback)(void* user_data);

// --------------- 仅暴露接口 ---------------
NetErr net_interface_init(void);
void net_interface_deinit(void);

NetErr net_interface_set_current_type(NetInterfaceType type);
NetInterfaceType net_interface_get_current_type(void);

NetErr net_interface_send_to(int32_xxl sock_fd, const char* ip, uint16_xxl port, const uint8_xxl* data, uint32_xxl len);

NetErr net_interface_enqueue(const NetRecvNode* node);
NetErr net_interface_dequeue(NetRecvNode* node, uint32_xxl timeout);
NetErr net_interface_bind(int32_xxl sock_fd, uint16_xxl port);
void net_interface_close(int32_xxl sock_fd);
int32_xxl net_interface_create_udp_socket(void);

int32_xxl net_interface_create_tcp_socket(void);
NetErr net_interface_tcp_connect(int32_xxl sock_fd, const char* ip, uint16_xxl port);
NetErr net_interface_tcp_recv(int32_xxl sock_fd, uint8_xxl* buf, uint32_xxl buf_len, uint32_xxl* actual_len, uint32_xxl timeout_ms);

NetErr net_interface_register(const NetInterface* iface);
void net_socket_close(PlatformSocket sock);

#ifdef __cplusplus
}
#endif

#endif  // NET_INTERFACE_H
