#pragma once
#include <stdint.h>

#pragma pack(push, 1)

// 1. 沪深10档快照
struct StkL2Snapshot {
    char symbol[32];              // 证券代码，例如"688111"
    uint8_t market;               // 市场标识，1:上海, 2:深圳, 3:香港, 4:北京
    int32_t date;                 // 业务日期（格式YYYYMMDD）
    int32_t time;                 // 更新时间（格式HHMMSSmmm）
    uint32_t pre_close;           // 前收盘价 (*10000)
    uint32_t open;                // 开盘价 (*10000)
    uint32_t high;                // 最高价 (*10000)
    uint32_t low;                 // 最低价 (*10000)
    uint32_t last;                // 最新价（成交价） (*10000)
    int64_t volume;               // 成交总量
    int64_t turnover;             // 成交总金额（取整）
    int64_t num_trades;           // 成交笔数
    uint32_t ask_price[10];       // 申卖价（十档） (*10000)
    int64_t ask_vol[10];          // 申卖量（十档）
    uint32_t bid_price[10];       // 申买价（十档） (*10000)
    int64_t bid_vol[10];          // 申买量（十档）
    int32_t ask_num_orders[10];   // 申卖十档委托笔数
    int32_t bid_num_orders[10];   // 申买十档委托笔数
    int64_t total_ask_vol;        // 委托卖出总量
    int64_t total_bid_vol;        // 委托买入总量
    uint32_t avg_ask_price;       // 加权平均委卖价格 (*10000)
    uint32_t avg_bid_price;       // 加权平均委买价格 (*10000)
    uint32_t limit_up;            // 涨停价 (*10000)
    uint32_t limit_down;          // 跌停价 (*10000)
    uint32_t iopv;                // 基金份额参考净值 (IOPV) (*10000)
    uint32_t pre_close_iopv;      // 基金份额参考净值昨收 (PreCloseIOPV) (*10000)
    char trading_phase[8];        // 交易阶段代码
    int32_t is_after_hours;       // 是否为盘后固定价格交易（1: 是, 0: 否）
};

// 2. 沪深逐笔成交
struct StkTransaction {
    char symbol[32];              // 证券代码
    uint8_t market;               // 市场标识，1:上海, 2:深圳, 3:香港, 4:北京
    int32_t date;                 // 业务日期（格式YYYYMMDD）
    int32_t time;                 // 成交时间（格式HHMMSSmmm）
    int64_t index;                // 成交编号 / 深圳ApplSeqNum
    uint32_t price;               // 成交价格 (*10000)
    int64_t volume;               // 成交数量
    int64_t turnover;             // 成交金额（取整）
    int64_t buy_id;               // 买方委托序号 / 深圳BidApplSeqNum
    int64_t sell_id;              // 卖方委托序号 / 深圳OfferApplSeqNum
    char bs_flag;                 // 买卖方向/内外盘标识（'B': 主买, 'S': 主卖, 'C': 撤单, ' ': 不明）
    char order_kind;              // 成交类别 / 深圳ExecType
    char function_code;           // 成交代码
    int32_t channel;              // 成交通道 / 深圳ChannelNo
};

// 3. 沪深逐笔委托
struct StkOrder {
    char symbol[32];              // 证券代码
    uint8_t market;               // 市场标识，1:上海, 2:深圳, 3:香港, 4:北京
    int32_t date;                 // 业务日期（格式YYYYMMDD）
    int32_t time;                 // 委托时间（格式HHMMSSmmm）
    int64_t index;                // 消息记录号 (上海 BizIndex / 深圳 ApplSeqNum)
    int64_t order_no;             // 委托号 (上海 OrderNO / 深圳 ApplSeqNum)
    uint32_t price;               // 委托价格 (*10000)
    int64_t volume;               // 委托数量
    char bs_flag;                 // 买卖方向/撤单标识（'B': 买入, 'S': 卖出, 'C': 撤单）
    char order_kind;              // 委托类别 / 深圳OrdType
    char function_code;           // 委托代码 / 深圳Side
    int32_t channel;              // 委托通道 / 深圳ChannelNo
};

// 4. 沪深指数
struct StkIndex {
    char symbol[32];              // 指数代码
    uint8_t market;               // 市场标识，1:上海, 2:深圳, 3:香港, 4:北京
    int32_t date;                 // 业务日期（格式YYYYMMDD）
    int32_t time;                 // 更新时间（格式HHMMSSmmm）
    uint32_t pre_close;           // 前收盘指数 (*10000)
    uint32_t open;                // 开盘指数 (*10000)
    uint32_t high;                // 最高指数 (*10000)
    uint32_t low;                 // 最低指数 (*10000)
    uint32_t last;                // 最新指数 (*10000)
    int64_t volume;               // 成交总量
    int64_t turnover;             // 成交总金额（取整）
    uint32_t close;               // 收盘指数 (*10000)
    int64_t num_trades;           // 成交笔数（仅深圳）
};

// 5. 上海合并逐笔
struct ShCombinedTick {
    char symbol[32];              // 证券代码
    int32_t date;                 // 业务日期（格式YYYYMMDD）
    int32_t time;                 // 时间（格式HHMMSSmmm）
    int64_t index;                // 业务序号（BizIndex/TickIndex）
    int32_t channel;              // 通道号
    char type;                    // 数据类型（'A': 新增委托订单, 'D': 删除委托订单即撤单, 'S': 产品状态订单, 'T': 成交）
    int64_t buy_id;               // 买方委托号
    int64_t sell_id;              // 卖方委托号
    uint32_t price;               // 价格 (*10000)
    int64_t volume;               // 数量
    int64_t turnover;             // 金额（取整，TradeMoney）
    char bs_flag;                 // 买卖方向/撤单标识 (TickBSFlag)
};

// 6. 深圳合并逐笔
struct SzCombinedTick {
    char symbol[32];              // 证券代码
    int32_t date;                 // 业务日期（格式YYYYMMDD）
    int32_t time;                 // 时间（格式HHMMSSmmm）
    int64_t index;                // 业务序号（ApplSeqNum）
    int32_t channel;              // 通道号（ChannelNo）
    int32_t type;                 // 数据类型（49: 市价委托, 50: 限价委托, 85: 本方最优, 52: 撤销, 70: 成交）
    int64_t buy_id;               // 买方委托号（BidApplSeqNum）
    int64_t sell_id;              // 卖方委托号（OfferApplSeqNum）
    uint32_t price;               // 价格 (*10000)
    int64_t volume;               // 数量
};

// 7. 广期所期货 L2 行情
struct GfexFutureL2 {
    char symbol[32];              // 合约代码，例如"ps2609-C-50000"
    int32_t action_day;           // 业务发生日（格式YYYYMMDD）
    int32_t trading_day;          // 交易日（格式YYYYMMDD）
    int32_t update_time;          // 最后更新时间（格式HHMMSSmmm）
    double last_price;            // 最新价
    double high_price;            // 最高价
    double low_price;             // 最低价
    double open_price;            // 开盘价
    int64_t last_volume;          // 单笔成交量
    int64_t volume;               // 累计成交总量
    double turnover;              // 累计成交总金额
    int64_t open_interest;        // 持仓量
    int64_t pre_open_interest;    // 昨持仓量
    int64_t open_interest_chg;    // 持仓量变化
    double average_price;         // 均价
    double close_price;           // 收盘价
    double settlement_price;      // 今结算价
    double pre_settlement_price;  // 昨结算价
    double pre_close_price;       // 昨收盘价
    int64_t buy_volume;           // 买方委托量总计
    int64_t sell_volume;          // 卖方委托量总计
    double avg_buy_price;         // 申买均价
    double avg_sell_price;        // 申卖均价
    double bid_price[5];          // 买报价（五档）
    int64_t bid_vol[5];           // 买数量（五档）
    int32_t bid_der_vol[5];       // 买派生数量（五档）
    double ask_price[5];          // 卖报价（五档）
    int64_t ask_vol[5];           // 卖数量（五档）
    int32_t ask_der_vol[5];       // 卖派生数量（五档）
    double limit_up;              // 涨停价
    double limit_down;            // 跌停价
    double life_high;             // 历史最高价
    double life_low;              // 历史最低价
};

// 8. 广期所期货成交量统计
struct GfexFutureQty {
    char symbol[32];              // 合约代码
    int32_t action_day;           // 业务发生日
    int32_t trading_day;          // 交易日
    int32_t update_time;          // 最后更新时间
    double price[5];              // 价格（最多5档）
    int64_t buy_open_vol[5];      // 买开仓量（最多5档）
    int64_t buy_cls_vol[5];       // 买平仓量（最多5档）
    int64_t sell_open_vol[5];     // 卖开仓量（最多5档）
    int64_t sell_cls_vol[5];      // 卖平仓量（最多5档）
};

// 9. 广期所期货最优价十笔委托
struct GfexFutureOrder {
    char symbol[32];              // 合约代码
    int32_t action_day;           // 业务发生日
    int32_t trading_day;          // 交易日
    int32_t update_time;          // 最后更新时间
    double bid_price;             // 最优申买价
    int64_t bid_order_qty[10];    // 最优买十笔委托量
    double ask_price;             // 最优申卖价
    int64_t ask_order_qty[10];    // 最优卖十笔委托量
};

// GFEX 当前文档仅覆盖期货；以下结构体采用 packed layout，与订阅器严格对应。

// 10. 5档期权快照行情 (中金所 CFFEX / 上期所 SHFE / 能源中心 INE / 郑商所 CZCE)
struct FutureOption5L2 {
    char symbol[32];              // 合约代码
    int32_t action_day;           // 业务发生日
    int32_t trading_day;          // 交易日
    int32_t update_time;          // 最后更新时间
    double last_price;            // 最新价
    double high_price;            // 最高价
    double low_price;             // 最低价
    double open_price;            // 开盘价
    int64_t volume;               // 成交量
    double turnover;              // 成交额
    double open_interest;         // 持仓量
    double pre_open_interest;     // 昨持仓量
    double close_price;           // 收盘价
    double settlement_price;      // 今结算价
    double pre_settlement_price;  // 昨结算价
    double pre_close_price;       // 昨收盘价
    double bid_price[5];          // 申买价（五档）
    int64_t bid_vol[5];           // 申买量（五档）
    double ask_price[5];          // 申卖价（五档）
    int64_t ask_vol[5];           // 申卖量（五档）
    double limit_up;              // 涨停价
    double limit_down;            // 跌停价
};

using CffexOptionL2 = FutureOption5L2;
using ShfeOptionL2 = FutureOption5L2;
using IneOptionL2 = FutureOption5L2;
using CzceOptionL2 = FutureOption5L2;

#pragma pack(pop)
