#ifndef BNTVS_SW_APP_HPP
#define BNTVS_SW_APP_HPP

#include <cstdint>
#include <string>
#include <vector>
#include <chrono>
#include <functional>

/**
 * @brief BNTVS_SW 命名空间，包含总线网络测试验证软件所有核心类型与函数。
 *
 * 该命名空间涵盖基础通信、协议兼容、数据存储、路由转发、总线分析、
 * 故障注入、信号转换和总线测试等全部软件单元的功能声明与实现。
 * 每个业务函数均通过 @requirement 标签关联对应的 CSCI 需求标识。
 */
namespace bntvs {

// ============================================================================
// 枚举类型定义
// ============================================================================

/// @brief 总线类型。
enum class BusType : uint8_t {
    ETHERNET = 0, ///< 以太网总线
    RS422    = 1, ///< RS422 串行总线
    CAN      = 2, ///< CAN 总线
    ANALOG   = 3, ///< 模拟量
    DIGITAL  = 4  ///< 离散量
};

/// @brief CAN 协议类型。
enum class CANProtocolType : uint8_t {
    CAN2_0 = 0, ///< CAN 2.0 协议
    CANFD  = 1  ///< CAN FD 协议
};

/// @brief 帧格式类型。
enum class FrameFormat : uint8_t {
    STANDARD = 0, ///< 标准帧 (11-bit ID)
    EXTENDED = 1  ///< 扩展帧 (29-bit ID)
};

/// @brief 路由类型。
enum class RouteType : uint8_t {
    STATIC  = 0, ///< 静态路由
    DYNAMIC = 1  ///< 动态路由
};

/// @brief 故障类型。
enum class FaultType : uint8_t {
    SHORT_CIRCUIT   = 0, ///< 短路
    OPEN_CIRCUIT    = 1, ///< 断路
    EMI             = 2, ///< 电磁干扰
    ERROR_FRAME     = 3, ///< 错误帧
    NODE_OFFLINE    = 4, ///< 节点离线
    NODE_ABNORMAL   = 5, ///< 节点异常接入
    BAUD_RATE_ANOM  = 6  ///< 波特率异常波动
};

// ============================================================================
// 数据结构定义
// ============================================================================

/**
 * @brief 总线数据记录，对应数据库总线数据记录表结构。
 *
 * 用于存储从总线采集的原始通信数据，包含时间戳、帧ID、
 * 数据载荷及协议类型等信息。
 */
struct BusDataRecord {
    int64_t      record_id     = 0;                    ///< 记录ID (数据库主键)
    std::string  bus_type;                             ///< 总线类型
    std::chrono::system_clock::time_point timestamp;   ///< 时间戳 (微秒精度)
    uint32_t     frame_id      = 0;                    ///< 帧ID
    uint32_t     data_length   = 0;                    ///< 数据长度
    std::vector<uint8_t> data_content;                 ///< 数据内容
    std::string  protocol_type;                        ///< 协议类型
    std::string  node_id;                              ///< 采集节点标识
};

/**
 * @brief 路由表条目，对应数据库路由表结构。
 */
struct RouteEntry {
    int         route_id       = 0;                    ///< 路由ID
    std::string dest_network;                          ///< 目标网络
    std::string netmask;                               ///< 子网掩码
    std::string next_hop;                              ///< 下一跳地址
    std::string out_interface;                         ///< 出接口
    int         priority       = 0;                    ///< 路由优先级
    std::string route_type;                            ///< 路由类型 (Static/Dynamic)
};

/**
 * @brief 网络状态信息，用于总线状态监视。
 */
struct NetworkStatus {
    double      bus_load          = 0.0;  ///< 总线负载率 (%)
    uint64_t    total_frames      = 0;    ///< 总帧数
    uint64_t    error_frames      = 0;    ///< 错误帧数
    double      capture_rate      = 0.0;  ///< 报文捕获速率 (帧/秒)
    std::string last_update_time;        ///< 最后更新时间
};

/**
 * @brief 性能测试指标。
 */
struct PerformanceMetrics {
    double avg_latency_us     = 0.0; ///< 平均延迟 (微秒)
    double max_latency_us     = 0.0; ///< 最大延迟 (微秒)
    double min_latency_us     = 0.0; ///< 最小延迟 (微秒)
    double throughput_mbps    = 0.0; ///< 吞吐量 (Mbps)
    double packet_loss_rate   = 0.0; ///< 丢包率 (%)
    uint64_t total_packets    = 0;   ///< 总报文数
    uint64_t lost_packets     = 0;   ///< 丢失报文数
};

/**
 * @brief 波形与时序分析结果。
 */
struct WaveformAnalysisResult {
    double      signal_frequency_hz = 0.0;  ///< 信号频率 (Hz)
    double      signal_amplitude    = 0.0;  ///< 信号幅度
    double      rise_time_us        = 0.0;  ///< 上升时间 (微秒)
    double      fall_time_us        = 0.0;  ///< 下降时间 (微秒)
    double      duty_cycle          = 0.0;  ///< 占空比 (%)
    uint64_t    glitch_count        = 0;    ///< 毛刺计数
    std::string analysis_summary;            ///< 分析摘要
};

// ============================================================================
// 基础通用通信单元 (SU-COM) — 函数声明
// ============================================================================

/**
 * @brief 初始化以太网通信接口。
 *
 * @requirement(name="基础通用通讯功能", id="SRS-F-01-001")
 * 实现以太网通信接口的初始化，支持 TCP/IP 和 UDP 协议，全双工千兆速率。
 *
 * @param ip_address 本机 IP 地址
 * @param port       通信端口
 * @return true  初始化成功
 * @return false 初始化失败
 */
bool initEthernetComm(const std::string& ip_address, uint16_t port);

/**
 * @brief 初始化 RS422 通信接口。
 *
 * @requirement(name="基础通用通讯功能", id="SRS-F-01-001")
 * 实现 RS422 异步串行通信接口的初始化，支持全双工和波特率自适应。
 *
 * @param port_name    串口名称 (如 COM1, /dev/ttyS0)
 * @param baud_rate    波特率
 * @return true  初始化成功
 * @return false 初始化失败
 */
bool initRS422Comm(const std::string& port_name, uint32_t baud_rate);

/**
 * @brief 初始化 CAN 通信接口。
 *
 * @requirement(name="基础通用通讯功能", id="SRS-F-01-001")
 * 实现 CAN 总线通信接口的初始化，支持 CAN2.0B/CANFD 协议，
 * 波特率 5K~1Mbps 可调。
 *
 * @param interface_name 接口名称 (如 can0)
 * @param baud_rate      波特率 (5K~1Mbps)
 * @return true  初始化成功
 * @return false 初始化失败
 */
bool initCANComm(const std::string& interface_name, uint32_t baud_rate);

/**
 * @brief 初始化模拟量采集接口。
 *
 * @requirement(name="基础通用通讯功能", id="SRS-F-01-001")
 * 实现模拟量信号采集接口的初始化，支持 0~10V 输入范围，12位精度。
 *
 * @param channel 采集通道编号
 * @return true  初始化成功
 * @return false 初始化失败
 */
bool initAnalogComm(uint8_t channel);

/**
 * @brief 初始化离散量 I/O 接口。
 *
 * @requirement(name="基础通用通讯功能", id="SRS-F-01-001")
 * 实现离散量 TTL 电平信号采集接口的初始化，支持 48 路 I/O。
 *
 * @param io_pin I/O 引脚编号
 * @return true  初始化成功
 * @return false 初始化失败
 */
bool initDigitalComm(uint8_t io_pin);

// ============================================================================
// 协议兼容单元 (SU-PROT) — 函数声明
// ============================================================================

/**
 * @brief 自动识别 CAN 帧采用的协议类型（CAN2.0 或 CAN FD）。
 *
 * @requirement(name="协议兼容功能", id="SRS-F-01-002")
 * 实现 CAN2.0 与 CANFD 协议的自动识别。
 *
 * @requirement(name="支持协议要求", id="SRS-F-09-007")
 * 支持 CANFD 和 CAN2.0 协议识别。
 *
 * @param frame_data 原始 CAN 帧数据
 * @return CANProtocolType 识别的协议类型
 */
CANProtocolType detectCANProtocol(const std::vector<uint8_t>& frame_data);

/**
 * @brief 在 CAN2.0 和 CAN FD 帧格式之间进行兼容转换。
 *
 * @requirement(name="协议兼容功能", id="SRS-F-01-002")
 * 实现 CAN2.0 与 CANFD 协议的切换适配和格式兼容转换，
 * 确保数据转发一致性。
 *
 * @param source_type  源协议类型
 * @param target_type  目标协议类型
 * @param frame_data   待转换的帧数据
 * @return std::vector<uint8_t> 转换后的帧数据
 */
std::vector<uint8_t> convertCANFrame(CANProtocolType source_type,
                                     CANProtocolType target_type,
                                     const std::vector<uint8_t>& frame_data);

// ============================================================================
// 数据存储单元 (SU-STOR) — 函数声明
// ============================================================================

/**
 * @brief 存储一条总线数据记录到持久化存储。
 *
 * @requirement(name="数据存储功能", id="SRS-F-02-001")
 * 实现通信数据的持久化存储，按时间顺序组织数据，
 * 支持自动分段存储和磁盘容量监控。
 *
 * @param record 总线数据记录
 * @return true  存储成功
 * @return false 存储失败
 */
bool storeBusData(const BusDataRecord& record);

/**
 * @brief 启动存储服务，包括磁盘容量监控。
 *
 * @requirement(name="数据存储功能", id="SRS-F-02-001")
 * 监控磁盘容量，满时触发告警及覆盖最旧数据。
 *
 * @return true  启动成功
 * @return false 启动失败
 */
bool startStorageService();

/**
 * @brief 停止存储服务。
 * @return true  停止成功
 * @return false 停止失败
 */
bool stopStorageService();

// ============================================================================
// 数据管理与回放单元 (SU-REPLAY) — 函数声明
// ============================================================================

/**
 * @brief 根据查询条件检索历史总线数据。
 *
 * @requirement(name="数据管理与数据回放功能", id="SRS-F-02-002")
 * 提供历史数据的检索功能，支持按总线类型、时间范围等条件查询。
 *
 * @param bus_type      总线类型筛选（空字符串表示全部）
 * @param start_time    起始时间
 * @param end_time      结束时间
 * @return std::vector<BusDataRecord> 匹配的记录列表
 */
std::vector<BusDataRecord> queryBusData(const std::string& bus_type,
                                        const std::string& start_time,
                                        const std::string& end_time);

/**
 * @brief 按原始时序和可调速度回放指定总线数据。
 *
 * @requirement(name="数据管理与数据回放功能", id="SRS-F-02-002")
 * 实现按原始时序、可调速度将存储数据回放。
 *
 * @requirement(name="数据统计回放功能", id="SRS-F-09-005")
 * 实现数据统计回放，在回放过程中统计各项指标。
 *
 * @param records      待回放的数据记录列表
 * @param speed_factor 回放速度倍数 (1.0 表示原始速度)
 * @param callback     每帧回放时的回调函数
 * @return uint64_t    实际回放的帧数
 */
uint64_t replayBusData(const std::vector<BusDataRecord>& records,
                       double speed_factor,
                       std::function<void(const BusDataRecord&)> callback);

/**
 * @brief 删除指定 ID 的历史数据记录。
 *
 * @requirement(name="数据管理与数据回放功能", id="SRS-F-02-002")
 * 支持历史数据的删除功能。
 *
 * @param record_id 要删除的记录 ID
 * @return true  删除成功
 * @return false 删除失败
 */
bool deleteBusData(int64_t record_id);

// ============================================================================
// 信号转换单元 (SU-CONV) — 函数声明
// ============================================================================

/**
 * @brief 将模拟量电压值转换为 CAN 总线帧。
 *
 * @requirement(name="信号转换功能", id="SRS-F-06-001")
 * 将模拟量信号进行数字化处理，转换为总线信号。
 *
 * @requirement(name="模拟量离散量转总线信号功能", id="SRS-F-06-005")
 * 实现模拟量向总线信号的转换。
 *
 * @param voltage       模拟量电压值 (0~10V)
 * @param can_id        CAN 目标帧 ID
 * @return BusDataRecord 转换后的总线数据记录
 */
BusDataRecord convertAnalogToBus(double voltage, uint32_t can_id);

/**
 * @brief 将离散量电平值转换为 CAN 总线帧。
 *
 * @requirement(name="信号转换功能", id="SRS-F-06-001")
 * 将离散量信号进行数字化处理，转换为总线信号。
 *
 * @requirement(name="模拟量离散量转总线信号功能", id="SRS-F-06-005")
 * 实现离散量向总线信号的转换。
 *
 * @param level         离散量电平 (0 或 5V)
 * @param can_id        CAN 目标帧 ID
 * @return BusDataRecord 转换后的总线数据记录
 */
BusDataRecord convertDigitalToBus(uint8_t level, uint32_t can_id);

// ============================================================================
// 总线路由单元 (SU-ROUTE) — 函数声明
// ============================================================================

/**
 * @brief 执行数据帧的路由转发。
 *
 * @requirement(name="数据转发交换功能", id="SRS-F-07-001")
 * 实现数据转发交换功能。
 *
 * @requirement(name="路由寻址功能", id="SRS-F-07-002")
 * 实现路由寻址，根据路由表决定转发路径。
 *
 * @param frame    待转发的数据帧
 * @return true  转发成功
 * @return false 转发失败
 */
bool routeDataFrame(const BusDataRecord& frame);

/**
 * @brief 将以太网数据帧转换为 CAN 总线帧。
 *
 * @requirement(name="以太网-CAN协议转换适配功能", id="SRS-F-07-003")
 * 实现以太网与 CAN 协议间的转换适配。
 *
 * @param eth_frame 以太网帧数据
 * @return BusDataRecord 转换后的 CAN 总线帧
 */
BusDataRecord convertEthernetToCAN(const BusDataRecord& eth_frame);

/**
 * @brief 将 CAN 总线帧转换为以太网数据帧。
 *
 * @requirement(name="以太网-CAN协议转换适配功能", id="SRS-F-07-003")
 * 实现 CAN 到以太网的协议转换。
 *
 * @param can_frame CAN 总线帧
 * @return BusDataRecord 转换后的以太网帧
 */
BusDataRecord convertCANToEthernet(const BusDataRecord& can_frame);

/**
 * @brief 添加一条静态路由。
 *
 * @requirement(name="路由功能要求", id="SRS-F-07-007")
 * 支持静态路由配置。
 *
 * @param entry 路由条目
 * @return true  添加成功
 * @return false 添加失败
 */
bool addStaticRoute(const RouteEntry& entry);

/**
 * @brief 添加一条动态路由（模拟 OSPF/RIP 协议行为）。
 *
 * @requirement(name="路由功能要求", id="SRS-F-07-007")
 * 支持动态路由协议。
 *
 * @param entry 路由条目
 * @return true  添加成功
 * @return false 添加失败
 */
bool addDynamicRoute(const RouteEntry& entry);

// ============================================================================
// 总线分析单元 (SU-ANALY) — 函数声明
// ============================================================================

/**
 * @brief 启动总线实时监听。
 *
 * @requirement(name="总线实时监听功能", id="SRS-F-09-001")
 * 启动对指定类型总线的实时监听，通过回调传递接收的数据。
 *
 * @param bus_type    要监听的总线类型
 * @param callback    接收数据时的回调
 * @return true  启动成功
 * @return false 启动失败
 */
bool startBusMonitoring(BusType bus_type,
                        std::function<void(const BusDataRecord&)> callback);

/**
 * @brief 停止总线监听。
 * @return true  停止成功
 * @return false 停止失败
 */
bool stopBusMonitoring();

/**
 * @brief 解析 CAN 帧数据，提取协议字段。
 *
 * @requirement(name="协议解析解码功能", id="SRS-F-09-002")
 * 实现协议解析解码，支持 CAN2.0 和 CAN FD 协议格式。
 *
 * @param raw_data 原始 CAN 帧数据
 * @return BusDataRecord 解析后的数据记录
 */
BusDataRecord parseCANFrame(const std::vector<uint8_t>& raw_data);

/**
 * @brief 对数据帧进行故障诊断分析。
 *
 * @requirement(name="故障诊断分析功能", id="SRS-F-09-003")
 * 实现故障诊断分析，检测各类总线错误。
 *
 * @requirement(name="错误帧识别要求", id="SRS-F-09-011")
 * 识别位错误、CRC 错误等错误帧类型。
 *
 * @param frame 待检查的数据帧
 * @return std::string 错误描述，空字符串表示无错误
 */
std::string diagnoseBusFault(const BusDataRecord& frame);

/**
 * @brief 检查帧数据是否存在位错误或 CRC 错误。
 *
 * @requirement(name="错误帧识别要求", id="SRS-F-09-011")
 * 要求识别位错误、CRC 错误等。
 *
 * @param frame_data 帧数据
 * @return true  检测到错误
 * @return false 无错误
 */
bool checkErrorFrame(const std::vector<uint8_t>& frame_data);

/**
 * @brief 执行波形与时序分析。
 *
 * @requirement(name="波形与时序分析功能", id="SRS-F-09-004")
 * 实现波形与时序分析，计算信号频率、幅度、占空比等参数。
 *
 * @param samples    采样数据序列
 * @param sample_rate_hz 采样率 (Hz)
 * @return WaveformAnalysisResult 分析结果
 */
WaveformAnalysisResult analyzeWaveform(const std::vector<double>& samples,
                                       double sample_rate_hz);

/**
 * @brief 获取当前网络状态信息。
 *
 * @requirement(name="网络状态监视功能", id="SRS-F-09-006")
 * 实现网络状态监视，刷新率不低于 1Hz。
 *
 * @param bus_type 总线类型
 * @return NetworkStatus 当前网络状态
 */
NetworkStatus getNetworkStatus(BusType bus_type);

// ============================================================================
// 故障注入单元 (SU-FAULT) — 函数声明
// ============================================================================

/**
 * @brief 向目标总线注入短路故障。
 *
 * @requirement(name="总线短路/断路注入", id="SRS-F-12-001")
 * 实现总线短路故障注入。
 *
 * @param bus_type 目标总线类型
 * @param duration_ms 持续时间 (毫秒)
 * @return true  注入成功
 * @return false 注入失败
 */
bool injectShortCircuit(BusType bus_type, uint32_t duration_ms);

/**
 * @brief 向目标总线注入断路故障。
 *
 * @requirement(name="总线短路/断路注入", id="SRS-F-12-001")
 * 实现总线断路故障注入。
 *
 * @param bus_type 目标总线类型
 * @param duration_ms 持续时间 (毫秒)
 * @return true  注入成功
 * @return false 注入失败
 */
bool injectOpenCircuit(BusType bus_type, uint32_t duration_ms);

/**
 * @brief 向目标总线注入电磁干扰故障。
 *
 * @requirement(name="电磁干扰注入", id="SRS-F-12-002")
 * 实现电磁干扰故障注入。
 *
 * @param bus_type      目标总线类型
 * @param intensity     干扰强度 (0.0~1.0)
 * @param duration_ms   持续时间 (毫秒)
 * @return true  注入成功
 * @return false 注入失败
 */
bool injectEMI(BusType bus_type, double intensity, uint32_t duration_ms);

/**
 * @brief 向目标总线注入错误帧。
 *
 * @requirement(name="错误帧注入", id="SRS-F-12-003")
 * 实现错误帧故障注入。
 *
 * @param bus_type      目标总线类型
 * @param error_type    错误类型描述
 * @return true  注入成功
 * @return false 注入失败
 */
bool injectErrorFrame(BusType bus_type, const std::string& error_type);

/**
 * @brief 模拟节点离线故障。
 *
 * @requirement(name="节点离线/异常接入", id="SRS-F-12-004")
 * 实现节点离线故障注入。
 *
 * @param node_id       目标节点标识
 * @param duration_ms   持续时间 (毫秒)
 * @return true  注入成功
 * @return false 注入失败
 */
bool injectNodeOffline(const std::string& node_id, uint32_t duration_ms);

/**
 * @brief 模拟节点异常接入故障。
 *
 * @requirement(name="节点离线/异常接入", id="SRS-F-12-004")
 * 实现节点异常接入故障注入。
 *
 * @param node_id       异常节点标识
 * @return true  注入成功
 * @return false 注入失败
 */
bool injectNodeAbnormal(const std::string& node_id);

/**
 * @brief 向目标总线注入波特率异常波动故障。
 *
 * @requirement(name="波特率异常波动注入", id="SRS-F-12-005")
 * 实现波特率异常波动故障注入。
 *
 * @param bus_type        目标总线类型
 * @param abnormal_baud   异常波特率
 * @param duration_ms     持续时间 (毫秒)
 * @return true  注入成功
 * @return false 注入失败
 */
bool injectBaudRateAnomaly(BusType bus_type, uint32_t abnormal_baud, uint32_t duration_ms);

// ============================================================================
// 总线测试分析单元 (SU-TEST) — 函数声明
// ============================================================================

/**
 * @brief 执行 40m 以内短距离总线的传输性能测试。
 *
 * @requirement(name="40m内总线测试分析功能", id="SRS-F-10-001")
 * 实现 40m 内总线传输延迟、吞吐量、丢包率等性能测试。
 *
 * @param bus_type     总线类型
 * @param test_duration_sec 测试持续时间 (秒)
 * @return PerformanceMetrics 测试结果指标
 */
PerformanceMetrics testShortBusPerformance(BusType bus_type, uint32_t test_duration_sec);

/**
 * @brief 执行 40m 以上（含中继）总线的传输性能测试。
 *
 * @requirement(name="40m以上总线测试分析功能", id="SRS-F-10-002")
 * 实现 40m 以上含中继总线的测试分析。
 *
 * @param bus_type     总线类型
 * @param test_duration_sec 测试持续时间 (秒)
 * @return PerformanceMetrics 测试结果指标
 */
PerformanceMetrics testLongBusPerformance(BusType bus_type, uint32_t test_duration_sec);

/**
 * @brief 执行长时间满负荷稳定性测试（≥24小时）。
 *
 * @requirement(name="长时间满负荷测试分析功能", id="SRS-F-10-003")
 * 实现长时间满负荷运行、重复启停等测试分析。
 *
 * @param bus_type         总线类型
 * @param duration_hours   测试持续时间 (小时)
 * @return PerformanceMetrics 测试结果指标
 */
PerformanceMetrics testLongDurationStability(BusType bus_type, uint32_t duration_hours);

// ============================================================================
// 辅助函数
// ============================================================================

/**
 * @brief 获取软件版本号。
 * @return std::string 版本号字符串
 */
std::string getVersion();

/**
 * @brief 打印命令行帮助信息。
 */
void printHelp();

} // namespace bntvs

#endif // BNTVS_SW_APP_HPP
