/**
* @file xlt_trade_struct.h
 * @author 上海前路有光数字科技
 * @date 2026-01-10
 * @brief 本文件定义XLT交易数据结构体
 */

#pragma once
#include "xlt_trade_data_type.h"
#include "xlt_struct.h"

namespace x1 {
#pragma  pack(push, 8)
    /**
     * @brief 新订单请求数据结构
     */
    typedef struct xlt_order_insert_info_t {
        uint64_t order_sequence;                            ///< 订单序号，当API配置中开启自定义模式时，由用户填写，session内不能重复，否则由系统生成，取值范围[0, 2^20-1]。
        price_t price;                                      ///< 价格放大10000倍
        quantity_t quantity;                                ///< 数量
        char security_code[CONST_STR_SECURITY_CODE_LEN];    ///< 证券代码，不带空格，并以'\\0'结尾
        ExchangeIndex exchange_index;                       ///< 交易市场
        OrderType order_type;                               ///< 报单价格类型
        Side side;                                          ///< 买卖方向
        BusinessType business_type;                         ///< 业务类型
    } xlt_order_insert_info_t;

    /**
     * @brief 撤单请求数据结构
     */
    typedef struct xlt_cancel_order_info_t {
        uint64_t order_sequence;                            ///< 订单序号，当API配置中开启自定义模式时，由用户填写，session内不能重复，否则由系统生成，取值范围[0, 2^20-1]。
        uint64_t origin_xid;                                ///< 原始订单标识
    } xlt_cancel_order_info_t;
#pragma pack(pop)

#pragma pack(push, 1)

    /**
     * @brief 日初资金信息结构体
     */
    typedef struct xlt_init_asset_info_t {
        uint64_t account_index;                             ///< 交易账户索引
        amount_t initial_amount;                            ///< 日初可用资金
        amount_t fund_balance;                              ///< 账户余额
    } xlt_init_asset_info_t;

    /**
     * @brief 日初持仓结构体
     */
    typedef struct xlt_init_position_info_t{
        uint64_t account_index;                             ///< 交易账户索引
        char security_code[CONST_STR_SECURITY_CODE_LEN];    ///< 证券代码
        ExchangeIndex exchange_index;                       ///< 交易市场
        quantity_t initial_quantity;                        ///< 初始可用数量
        quantity_t total_quantity;                          ///< 总持仓
        quantity_t frozen_quantity;                         ///< 冻结数量
    } xlt_init_position_info_t;


    /**
     * @brief 消息推送描述信息
     */
    typedef struct xlt_msg_desc_t {
        uint64_t account_index;                             ///< 账号索引
        uint64_t sequence;                                  ///< 消息序号，递增，断点续传标识。为0时，不能作为续传标识。快速订单回报为0。
        bool is_rebuild;                                    ///< 是否为重推请求消息，若是通过rebuild_trade_message接口发起则为true，若是通过subscribe_trade_message接口发起则为false
    } xlt_msg_desc_t;

    /**
     * @brief 新订单申报成功响应
     */
    typedef struct xlt_order_response_t{
        uint8_t client_id;                                  ///< 委托源标识，用户登录时自定义
        char report_id[CONST_REPORT_ID_LEN];                ///< 回报标识，32字节，非字符串
        uint64_t xid;                                       ///< 报单标识
        ExOrdStatus ord_status;                             ///< 交易所订单状态
        ExExecType exec_type;                               ///< 交易所执行类型
        char security_code[CONST_STR_SECURITY_CODE_LEN];    ///< 证券代码，不带空格，并以'\\0'结尾
        ExchangeIndex exchange_index;                       ///< 交易市场
        price_t price;                                      ///< 委托价格，放大10000倍
        quantity_t quantity;                                ///< 委托数量
        Side side;                                          ///< 买卖方向
        quantity_t leaves_quantity;                         ///< 剩余数量
        quantity_t cancel_quantity;                         ///< 撤单数量
        int cancel_reason_id;                               ///< 撤单原因id，上交所即成剩撤时有意义
        int64_t transact_time;                              ///< 回报时间，格式为YYYYMMDDHHMMSSsss
    } xlt_order_response_t;

    /**
     * @brief 撤单申报成功响应
     */
    typedef struct xlt_cancel_response_t{
        uint8_t client_id;                                  ///< 委托源标识，用户登录时自定义
        char report_id[CONST_REPORT_ID_LEN];                ///< 回报标识，32字节，非字符串
        uint64_t xid;                                       ///< 报单标识
        uint64_t origin_xid;                                ///< 原始订单标识（撤单申报时有意义）
        ExOrdStatus ord_status;                             ///< 交易所订单状态
        ExExecType exec_type;                               ///< 交易所执行类型
        quantity_t cancel_quantity;                         ///< 撤单数量
        int cancel_reason_id;                               ///< 撤单原因id
        int64_t transact_time;                              ///< 回报时间，格式为YYYYMMDDHHMMSSsss
    } xlt_cancel_response_t;

    /**
     * @brief 成交回报
     */
    typedef struct xlt_trade_report_t{
        uint8_t client_id;                                  ///< 委托源标识，用户登录时自定义
        char report_id[CONST_REPORT_ID_LEN];                ///< 回报标识，32字节，非字符串
        uint64_t xid;                                       ///< 报单标识
        ExOrdStatus ord_status;                             ///< 交易所订单状态
        ExExecType exec_type;                               ///< 交易所执行类型
        char exec_id[CONST_TRD_EXEC_ID_LEN];                ///< 交易所成交编号，对应上交所TrdCnfmID，深交所ExecID。上交所成交编号不唯一，需要配合xid使用，深交所成交编号全天唯一。
        price_t price;                                      ///< 成交价格，该笔成交回报的成交价格，放大10000倍
        quantity_t quantity;                                ///< 成交数量，该笔成交回报的成交数量
        quantity_t leaves_quantity;                         ///< 剩余数量
        quantity_t order_quantity;                          ///< 委托数量
        int64_t transact_time;                              ///< 回报时间，格式为YYYYMMDDHHMMSSsss
        amount_t amount;                                    ///< 成交金额，该笔成交回报的成交金额，放大10000倍
    } xlt_trade_report_t;

    /**
     * @brief 申报失败响应（新订单申报失败，撤单失败）
     */
    typedef struct xlt_order_error_response_t{
        uint8_t client_id;                                  ///< 委托源标识，用户登录时自定义
        char report_id[CONST_REPORT_ID_LEN];                ///< 回报标识，32字节，非字符串
        uint64_t xid;                                       ///< 报单标识
        uint64_t origin_xid;                                ///< 原始订单标识（撤单申报时有意义）
        uint8_t is_cancel_flag;                             ///< 撤单标识，如果为1, 当前记录为撤单，否则为新订单。
        xlt_error_info_t error_info;                        ///< 错误信息
        int64_t transact_time;                              ///< 回报时间，格式为YYYYMMDDHHMMSSsss
    } xlt_order_error_response_t;

    /**
    * @brief 订单结束通知
    */
    typedef struct xlt_order_end_t{
        uint8_t client_id;                                  ///< 委托源标识，用户登录时自定义
        char report_id[CONST_REPORT_ID_LEN];                ///< 回报标识，32字节，非字符串
        uint64_t xid;                                       ///< 报单标识
        int64_t transact_time;                              ///< 回报时间，格式为YYYYMMDDHHMMSSsss
    } xlt_order_end_t;


    /**
     * @brief 订单信息结构体
     */
    typedef struct xlt_order_info_t{
        uint8_t client_id;                                  ///< 委托源标识，用户登录时自定义
        uint64_t account_index;                             ///< 交易账户索引
        uint64_t xid;                                       ///< 报单标识
        uint64_t origin_xid;                                ///< 原始订单标识
        OrderStatus order_status;                           ///< 订单状态
        uint8_t is_cancel_flag;                             ///< 撤单标识，如果为1, 当前记录为撤单，否则为新订单。
        char cl_order_id[CONST_CL_ORD_ID_LEN];              ///< 报盘合同号
        char origin_cl_order_id[CONST_CL_ORD_ID_LEN];       ///< 原委托报盘合同号，如果非空，则代表撤单

        char security_code[CONST_STR_SECURITY_CODE_LEN];    ///< 证券代码
        ExchangeIndex exchange_index;                       ///< 交易市场
        OrderType order_type;                               ///< 报单价格类型
        Side side;                                          ///< 买卖方向
        BusinessType business_type;                         ///< 业务类型
        price_t order_price;                                ///< 委托价格
        quantity_t order_quantity;                          ///< 委托数量
        amount_t order_amount;                              ///< 委托金额
        amount_t order_fee;                                 ///< 委托费用
        int64_t insert_time;                                ///< 委托时间，格式为YYYYMMDDHHMMSSsss

        quantity_t trade_quantity;                          ///< 成交数量
        amount_t trade_amount;                              ///< 成交金额
        amount_t trade_fee;                                 ///< 成交费用
        amount_t trade_fix_fee;                             ///< 成交固定费用
        uint32_t trade_count;                               ///< 成交笔数
        quantity_t leaves_quantity;                         ///< 剩余数量
        quantity_t cancel_quantity;                         ///< 撤单数量
        int64_t trade_time;                                 ///< 最后一笔成交时间，格式为YYYYMMDDHHMMSSsss
        int64_t cancel_time;                                ///< 撤单时间，撤单成功才填写，即成剩撤的单也需要填写。格式为 YYYYMMDDHHMMSSsss
        int64_t update_time;                                ///< 最后更新时间，格式为 YYYYMMDDHHMMSSsss

        xlt_error_info_t error_info;                        ///< 错误信息
    } xlt_order_info_t;

    /**
     * @brief 订单簿，订单响应回报联合体
     */
    typedef union xlt_order_book_report_union_t{
        xlt_order_response_t order_response;                ///< 新订单申报成功响应
        xlt_cancel_response_t cancel_response;              ///< 撤单申报成功响应
        xlt_trade_report_t trade_report;                    ///< 成交回报
    } xlt_order_book_report_union_t;

    /**
     * @brief 订单簿，新订单通知结构体
     */
    typedef struct xlt_order_book_insert_t {
        uint8_t client_id;                                  ///< 委托源标识，用户登录时自定义
        uint64_t account_index;                             ///< 交易用户索引
        uint64_t xid;                                       ///< 报单标识
        uint64_t origin_xid;                                ///< 原始订单标识 (撤单申报时有意义)
        OrderStatus order_status;                           ///< 订单状态：INIT初始
        uint8_t is_cancel_flag;                             ///< 撤单标识，如果为1, 当前记录为撤单，否则为新订单。
        char cl_order_id[CONST_CL_ORD_ID_LEN];              ///< 报盘合同号
        char origin_cl_order_id[CONST_CL_ORD_ID_LEN];       ///< 原委托报盘合同号，如果非空，则代表撤单

        char security_code[CONST_STR_SECURITY_CODE_LEN];    ///< 证券代码，不带空格，并以'\\0'结尾
        ExchangeIndex exchange_index;                       ///< 交易市场
        OrderType order_type;                               ///< 报单价格类型
        Side side;                                          ///< 买卖方向
        BusinessType business_type;                         ///< 业务类型
        price_t order_price;                                ///< 价格放大10000倍
        quantity_t order_quantity;                          ///< 数量
        amount_t order_amount;                              ///< 委托金额
        amount_t order_fee;                                 ///< 委托费用
        int64_t insert_time;                                ///< 委托时间，格式为YYYYMMDDHHMMSSsss
    } xlt_order_book_insert_t;

    /**
    * @brief 订单簿，订单变更通知结构体，包括订单状态变更、撤单、成交等信息
    */
    typedef struct xlt_order_book_update_t {
        uint8_t client_id;                                  ///< 委托源标识，用户登录时自定义
        uint64_t account_index;                             ///< 交易账户索引
        uint64_t xid;                                       ///< 报单标识
        uint64_t origin_xid;                                ///< 原始订单标识 (撤单申报时有意义)
        OrderStatus order_status;                           ///< 订单状态
        uint8_t is_cancel_flag;                             ///< 撤单标识，如果为1, 当前记录为撤单，否则为新订单。
        char cl_order_id[CONST_CL_ORD_ID_LEN];              ///< 报盘合同号
        char origin_cl_order_id[CONST_CL_ORD_ID_LEN];       ///< 原委托报盘合同号，如果非空，则代表撤单

        quantity_t trade_quantity;                          ///< 成交数量
        amount_t trade_amount;                              ///< 成交金额
        amount_t trade_fee;                                 ///< 成交费用
        amount_t trade_fix_fee;                             ///< 成交固定费用
        uint32_t trade_count;                               ///< 成交笔数
        quantity_t leaves_quantity;                         ///< 剩余数量
        quantity_t cancel_quantity;                         ///< 撤单数量
        int64_t trade_time;                                 ///< 最后一笔成交时间，格式为YYYYMMDDHHMMSSsss
        int64_t cancel_time;                                ///< 撤单时间，撤单成功才填写，即成剩撤的单也需要填写。格式为 YYYYMMDDHHMMSSsss
        int64_t update_time;                                ///< 最后更新时间，格式为 YYYYMMDDHHMMSSsss

        TradeReportType report_type;                        ///< 回报通知类型，根据类型决定report联合体访问字段，ORDER_RESPONSE-订单申报响应，CANCEL_RESPONSE-撤单申报响应，TRADE_REPORT-成交回报
        xlt_order_book_report_union_t report;               ///< 订单回报及响应联合体结构体
    } xlt_order_book_update_t;

    /**
    * @brief 订单簿，订单错误通知结构体，包括申报失败、撤单失败等信息
    */
    typedef struct xlt_order_book_error_t {
        uint8_t client_id;                                  ///< 委托源标识，用户登录时自定义
        uint64_t account_index;                             ///< 交易用户索引
        uint64_t xid;                                       ///< 报单标识
        uint64_t origin_xid;                                ///< 原始订单标识 (撤单申报时有意义)
        OrderStatus order_status;                           ///< 订单状态
        uint8_t is_cancel_flag;                             ///< 撤单标识，如果为1, 当前记录为撤单，否则为新订单。
        char cl_order_id[CONST_CL_ORD_ID_LEN];              ///< 报盘合同号
        char origin_cl_order_id[CONST_CL_ORD_ID_LEN];       ///< 原委托报盘合同号，如果非空，则代表撤单

        int64_t update_time;                                ///< 最后更新时间，格式为 YYYYMMDDHHMMSSsss

        xlt_order_error_response_t order_error;             ///< 订单错误响应（申报失败或者撤单失败）
    } xlt_order_book_error_t;

    /**
     * @brief 持仓结构体
     */
    typedef struct xlt_position_info_t{
        uint64_t account_index;                             ///< 交易账户索引
        char security_code[CONST_STR_SECURITY_CODE_LEN];    ///< 证券代码
        ExchangeIndex exchange_index;                       ///< 交易市场
        quantity_t total_quantity;                          ///< 总持仓
        quantity_t sellable_quantity;                       ///< 可卖持仓
        quantity_t frozen_quantity;                         ///< 卖出冻结数量
    } xlt_position_info_t;

    /**
     * @brief 账户资金信息
     */
    typedef struct xlt_asset_info_t{
        uint64_t account_index;                             ///< 交易账户索引
        amount_t available_amount;                          ///< 可用资金
        amount_t withholding_amount;                        ///< 系统预扣的资金（买入未成交冻结资金）
        amount_t fund_buy_amount;                           ///< 累计买入成交金额
        amount_t fund_buy_fee;                              ///< 累计买入成交费用
        amount_t fund_sell_amount;                          ///< 累计卖出成交金额
        amount_t fund_sell_fee;                             ///< 累计卖出成交费用
        amount_t withdraw_amount;                           ///< 当日划出金额
        amount_t deposit_amount;                            ///< 当日划入金额
        amount_t withdrawable_amount;                       ///< 可取金额
    } xlt_asset_info_t;


    /**
     * @brief 资金划转消息头
     */
    typedef struct xlt_fund_transfer_head_t {
        uint64_t account_index;                             ///< 交易账号索引
        char biz_no[CONST_BIZ_NO_LEN];                      ///< 资金划转业务流水号，特权(交易)API：API生成，token_id+序号，管理API：管理系统生成，外部系统保证全局唯一
    } xlt_fund_transfer_head_t;

    /**
     * @brief 主柜资金划转申请
     */
    typedef struct xlt_counter_fund_transfer_request_t {
        uint64_t account_index;                             ///< 交易账号索引
        char biz_no[CONST_BIZ_NO_LEN];                      ///< 资金划转业务流水号，特权(交易)API：API生成，token_id+序号，管理API：管理系统生成，外部系统保证全局唯一
        FundTransSource source;                             ///< 请求来源：ADMIN: 管理系统发起； OTHER:其他
        FundTransSide side;                                 ///< 划转方向，IN-划入（从主柜划入到xlight），OUT-划出（从xlight划出到主柜）
        amount_t amount;                                    ///< 划转金额，放大10000倍
        int64_t request_time;                               ///< 划转请求时间，格式为YYYYMMDDHHMMSSsss，特权(交易)API：API生成，管理API：管理系统生成
    }xlt_counter_fund_transfer_request_t;

    /**
     * @brief 主柜资金划转结果
     */
    typedef struct xlt_counter_fund_transfer_result_t {
        uint64_t account_index;                             ///< 交易账号索引
        char biz_no[CONST_BIZ_NO_LEN];                      ///< 资金划转业务流水号，特权(交易)API：API生成，token_id+序号，管理API：管理系统生成，外部系统保证全局唯一
        FundTransSource source;                             ///< 请求来源：ADMIN: 管理系统发起； OTHER:其他
        FundTransSide side;                                 ///< 划转方向，IN-划入（从主柜划入到xlight），OUT-划出（从xlight划出到主柜）
        amount_t amount;                                    ///< 划转金额，放大10000倍
        int64_t request_time;                               ///< 划转请求时间，格式为YYYYMMDDHHMMSSsss，特权(交易)API：API生成，管理API：管理系统生成
        int64_t result_time;                                ///< 划转结果时间，格式为YYYYMMDDHHMMSSsss
        FundTransStatus status;                             ///< 划转状态，DOING-处理中，SUCCESS-成功，FAIL-失败，EXCEPTION-异常
        xlt_error_info_t error_info;                        ///< 划转错误信息，当status为2时有效
    }xlt_counter_fund_transfer_result_t;

    /**
     * @brief 双中心资金划转请求
     * @remark 方向只有划入
     */
    typedef struct xlt_cluster_fund_transfer_request_t {
        uint64_t account_index;                             ///< 交易账号索引：划入账号索引
        char biz_no[CONST_BIZ_NO_LEN];                      ///< 资金划转业务流水号
        FundTransSource source;                             ///< 请求来源：ADMIN: 管理系统发起； OTHER:其他
        amount_t amount;                                    ///< 划转金额，放大10000倍
        int64_t request_time;                               ///< 划转请求时间，格式为YYYYMMDDHHMMSSsss
    } xlt_cluster_fund_transfer_request_t;

    /**
     * @brief 双中心资金划转结果
     */
    typedef struct xlt_cluster_fund_transfer_result_t {
        uint64_t account_index;                             ///< 交易账号索引：划入账号索引
        char biz_no[CONST_BIZ_NO_LEN];                      ///< 资金划转业务流水号
        FundTransSource source;                             ///< 请求来源：ADMIN: 管理系统发起； OTHER:其他
        amount_t amount;                                    ///< 划转金额，放大10000倍
        int64_t request_time;                               ///< 划转请求时间，格式为YYYYMMDDHHMMSSsss
        int64_t result_time;                                ///< 划转结果时间，格式为YYYYMMDDHHMMSSsss
        FundTransStatus status;                             ///< 划转状态，DOING-处理中，SUCCESS-成功，FAIL-失败，EXCEPTION-异常
        xlt_error_info_t error_info;                        ///< 划转错误信息，当status为2时有效
    } xlt_cluster_fund_transfer_result_t;

    /**
     * @brief 订单查询请求-条件查询
     */
    typedef struct {
        uint64_t xid;                                       ///< 需要查询的委托编号，如果为0则根据后续条件进行查询，如果不为0，则只查询指定订单，忽略后续查询条件
        char security_code[CONST_STR_SECURITY_CODE_LEN];    ///< 证券代码，可以为空，如果不为空，请不带空格，并以'\\0'结尾，则默认查询时间段内的所有成交回报
        int64_t begin_time;                                 ///< 格式为YYYYMMDDHHMMSSsss，为0则默认当前交易日0点
        int64_t end_time;                                   ///< 格式为YYYYMMDDHHMMSSsss，为0则默认当前时间
        uint8_t query_unfinished;                           ///< 是否只查询未完成订单：1是，0否
    } xlt_order_query_param_t;

    /**
     * @brief 交易账户信息
     */
    typedef struct xlt_trade_account_info_t {
        uint64_t account_index;                             ///< 交易账户索引
        uint8_t account_type;                               ///< 账户类别，预留
        char account_name[CONST_ACC_NAME_LEN];              ///< 交易账户名称
        uint64_t fund_account_index;                        ///< 资金账户索引
        char fund_account_name[CONST_FUND_ACC_NAME_LEN];    ///< 资金账户名称
    } xlt_trade_account_info_t;

#pragma pack(pop)
}
