/**
 * @file xlt_quote_config.h
 * @author 上海前路有光数字科技
 * @date 2026-03-01
 * @brief 本文件定义XLT 行情API配置类
 */

#pragma once

#include <sys/socket.h>
#include <cstring>
#include "xlt_quote_data_type.h"

namespace x1 {

    /**
     * @brief API行情配置类
     * 用户需要在调用XLTQuoteApi::initialize方法前，创建此类实例，并设置相应的配置参数，然后将此实例传递给XLTQuoteApi::initialize方法。
     */
    class XLTQuoteConfig {
    public:
        XLTQuoteConfig() = default;
        /**
         * @brief 设置交易日，格式YYYYMMDD，如20230901
         * @param trading_day 交易日
         * @remark 用户需明确指定交易日，生产环境为当前交易日，测试环境为测试柜台指定的交易日
         */
        void set_trading_day(uint64_t trading_day) { trading_day_ = trading_day; }
        /**
         * @brief 设置本地网卡IP地址
         * @param agw 连接agw的本地网卡IP，生产环境需为AGW接入网段IP
         * @param quote 接收行情数据的本地网卡IP，生产环境需为行情接收网段IP
         * @return 设置是否成功
         * @remark 生产环境中，quote对应网卡建议为solarflare网卡，solarflare网卡将自动使用ef_vi，以便达到最优的性能，非solarflare网卡则回退到内核sock模式
         */
        bool set_local_addr(const char* agw, const char* quote);
        /**
         * @brief 添加网关地址
         * @param ip_addr agw IP地址
         * @param port agw端口
         * @return 设置是否成功
         * @remark 请向券商获取agw地址和端口，可重复调用添加多个agw地址，每次登录会随机选取当前可用的agw
         */
        bool add_agw_addr(const char* ip_addr, uint16_t port);
        /**
         * @brief 设置是否使用level2行情，默认不使用
         * @param use_level2 是否使用level2行情
         */
        void set_use_level2(bool use_level2) { use_level2_ = use_level2; };

        /*================= 以下为获取配置参数接口，为内部使用 ============*/
        /**
         * @brief 获取交易日，格式YYYYMMDD，如20230901
         * @return 交易日
         */
        uint64_t trading_day() const { return trading_day_; }
        /**
         * @brief 获取指定本地地址
         * @param index 0-AGW，1-行情
         * @return 本地地址
         */
        sockaddr get_local_addr(uint64_t index) const;
        /**
         * @brief 获取agw地址数量
         * @return agw地址数量
         */
        uint64_t agw_count() const { return agw_count_; };
        /**
         * @brief 获取指定agw地址列表
         * @return agw地址列表
         */
        sockaddr* agw_addrs() { return agw_addr_; }
        /**
         * @brief 获取是否使用level2行情
         * @return 是否使用level2行情
         */
        bool use_level2() const { return use_level2_; };

    private:
        uint64_t trading_day_ = 0;                           ///< 用户配置的交易日
        sockaddr local_addr_[3] = {};                        ///< 本地地址列表，0-AGW，1-交易，2-行情
        uint64_t agw_count_ = 0;                             ///< AGW地址数量
        sockaddr agw_addr_[32] = {};                         ///< AGW地址列表
        bool use_level2_ = false;                            ///< 是否使用level2行情，true-使用，false-不使用。不管是否打开此标志，用户都可以接收和处理level1行情。
    };
}
