#ifndef DATA_PRASER_H
#define DATA_PRASER_H

#include <cstdint>
#include <vector>
#include <string>
#include <jni.h>
#include <queue>
#include <functional>

// 设备类型枚举
enum class DataType {
    EEG,            // 脑电
    ECG_2LEAD,      // 胸腹心电/肌电
    ECG_12LEAD,     // 12导联心电
    PPG,            // 血氧
    RESPIRATION,    // 呼吸/姿态
    SNORE,          // 鼾声
    STETHOSCOPE,     // 数字听诊
    MIT_BIH,        // MIT-BIH心律失常数据集类型
    PW_ECG_SL       // 单通道心电数据 (0x4401)
};

// 导联脱落状态
struct LeadOffStatus {
    uint8_t status[2];  // 导联状态字节
};

// 统一传感器数据结构
struct SensorData {
    DataType data_type;
    uint16_t packet_sn;         // 数据包序列号
    LeadOffStatus lead_status;   // 导联状态
    int64_t timestamp;           // 系统时间戳(微秒)
    float sqi; //信号质量

    // 通道数据
    std::variant<
            std::vector<float>,      // 单通道数据
            std::vector<std::vector<float>> // 多通道数据
    > channel_data;
    std::vector<uint8_t> raw_data;  // 原始二进制数据
    // 附加数据
    struct {
        uint16_t movement;      // 运动强度 (呼吸设备)
        uint8_t posture;        // 姿态 (呼吸设备)
        uint8_t ambient_light;  // 环境光 (呼吸设备)
        uint8_t hr;             // 心率 (血氧)
        uint8_t spo2;           // 血氧饱和度 (血氧)
        float temperature;      // 温度 (修正为浮点类型)
        uint8_t gpio_state;     // GPIO状态 (12导联心电)
    } additional;
};

// 前向声明
struct SensorData;
struct FileManager;
enum class DataType;

// 辅助函数：从字节数组读取小端整数
template <typename T>
T read_le(const uint8_t* data);

// 脑电设备解析 (0x4230)
SensorData parse_eeg(const uint8_t* data);

// 心电设备解析 (0x4211)
SensorData parse_ecg_emg(const uint8_t* data);

// 血氧设备解析(0x4302)
SensorData parse_ppg(const uint8_t* data);

// 12导联心电解析 (0x4402)
SensorData parse_12lead_ecg(const uint8_t* data);

// 单通道心电解析 (0x4401) - PW_ECG-SL
SensorData parse_pw_ecg_sl(const uint8_t* data);

// MIT-BIH 212格式解析器
SensorData parse_mit_bih_212(const uint8_t* data, size_t size);

// 数字听诊解析 (0x1102)
SensorData parse_stethoscope(const uint8_t* data);

// 鼾声解析 (0x4212)
SensorData parse_snore(const uint8_t* data);

// 呼吸/姿态/环境光解析(0x4213)
SensorData parse_respiration(const uint8_t* data);

// 统一解析入口函数 - 支持多个包头和数据包格式
std::vector<SensorData> parse_device_data(const std::vector<uint8_t>& file_data);

// CRC16校验函数
uint16_t calculate_crc16(const uint8_t* data, size_t length);

// 工具函数：将数值转换为十六进制字符串
std::string to_hex_string(uint16_t value);

// JNI辅助函数：将C++的SensorData转换为Java对象
jobject convertSensorDataToJava(JNIEnv* env, const SensorData& sensorData);

// JNI辅助函数：将Java的byte数组转换为C++的vector
std::vector<uint8_t> convertJavaByteArrayToVector(JNIEnv* env, jbyteArray byteArray);

// JNI辅助函数：将C++的vector<SensorData>转换为Java的List
jobject convertSensorDataVectorToJavaList(JNIEnv* env, const std::vector<SensorData>& sensorDataVector);


class StreamParser {
    public:
        StreamParser();
        ~StreamParser();
        
        // 添加新接收到的数据
        void appendData(const uint8_t* data, size_t length);
        
        // 检查是否有完整的数据包可用
        bool hasCompletePacket() const;
        
        // 获取下一个完整的数据包
        SensorData getNextPacket();
        
        // 获取所有可用数据包
        std::vector<SensorData> getAllPackets();
        
        // 设置数据包处理回调函数
        void setPacketCallback(std::function<void(const SensorData&)> callback);
        
        // 清空缓冲区
        void clear();
        
        // 新增：状态查询方法
        size_t getBufferSize() const;
        size_t getTotalPackets() const;
        size_t getPendingDataSize() const;
        bool isBufferEmpty() const;
        size_t getQueuedPacketCount() const;
        
    private:
        std::vector<uint8_t> buffer_;
        std::queue<SensorData> complete_packets_;
        static const size_t PACKET_SIZE = 238; // 固定数据包大小
        std::function<void(const SensorData&)> packet_callback_;
        
        // 新增：成员变量
        size_t buffer_size_;      // 累计接收的数据大小
        size_t total_packets_;    // 累计解析的数据包数量
        
        // 内部解析方法
        void parseBuffer();
        
        // 新增：数据包验证方法
        bool isValidPacket(const uint8_t* data);
    };

    
#endif // DATA_PRASER_H
