#pragma once
#include "xlt_quote_define.h"
#include "xlt_quote_struct.h"
namespace x1 {
    typedef union xlt_quote_data_union_t {
        const xlt_sse_l1_index_t* sse_l1_index;             ///< QuoteMsgType::SSE_L1_INDEX 上交所Level1指数
        const xlt_sse_l1_snapshot_t* sse_l1_snapshot;       ///< QuoteMsgType::SSE_L1_SNAPSHOT 上交所Level1快照
        const xlt_szse_l1_index_t* szse_l1_index;           ///< QuoteMsgType::SZSE_L1_INDEX 深交所Level1指数
        const xlt_szse_l1_snapshot_t* szse_l1_snapshot;     ///< QuoteMsgType::SZSE_L1_SNAPSHOT 深交所Level1快照
        const xlt_szse_l1_snapshot_bond_t* szse_l1_snapshot_bond; ///< QuoteMsgType::SZSE_L1_BOND_SNAPSHOT 深交所Level1债券快照
    }xlt_quote_data_union_t;

    /**
     * @brief get_next 返回的行情数据项
     */
    typedef struct XLTQuoteItem {
        QuoteMsgType data_type;                             ///< 数据类型，用户根据此字段选择对应结构体解析 data
        xlt_quote_data_union_t data;                        ///< 指向解码后数据的指针
    }XLTQuoteItem;

    /**
     * @brief xlight行情解码迭代器
     *
     * 支持以下行情源：
     * QuoteMCType::XLT_SSE_L1
     * QuoteMCType::XLT_SZSE_L1
     *
     */
    class XLTQuoteDecoder {
    public:
        using StepFunc = const XLTQuoteItem* (*)(uint8_t*& data, uint32_t& remain, XLTQuoteItem& item);

        XLTQuoteDecoder(QuoteMCType mc_type, const void* msg_data, uint32_t msg_len);
        ~XLTQuoteDecoder() = default;
        /// 不可拷贝、不可移动
        XLTQuoteDecoder(const XLTQuoteDecoder&) = delete;
        XLTQuoteDecoder& operator=(const XLTQuoteDecoder&) = delete;

        /**
         * @brief 获取下一条解码后的行情数据
         * @return 非空指针表示一条有效数据，nullptr 表示遍历结束或构造时 mc_type 不支持
         * @note 返回的指针在下一次调用 get_next() 后失效（指向内部复用对象）
         * @note data 指针的生命周期与构造时传入的 msg_data 一致
         */
        const XLTQuoteItem* get_next();
    protected:
        StepFunc step_fn_;
        uint8_t* data_;
        uint32_t remain_;
        XLTQuoteItem item_;
    };
}