#pragma once

#include <string>
#include <unordered_set>

#include <memory>
#include <onepiece/models/OnePieceEnum.h>
#include <onepiece/models/PositionData.h>
#include <onepiece/models/ContractData.h>

class ICoreListener;

using namespace std;

class ITraderApi
{
public:
    virtual bool Connect() = 0;

    virtual bool Disconnect() = 0;

    virtual bool InsertOrder(OrderSPtr orderSPtr) = 0;

    virtual bool CancelOrder(const OrderSPtr orderSPtr) = 0;

    virtual bool RegisterListener(ICoreListener* coreListener) = 0;

    virtual const shared_ptr<vector<string>> TradingInstrumentIDs() = 0;

    virtual const ContractSPtr GetSysContractSPtr(const string& instrumentID) = 0;

public:
    virtual bool IsSHFEOrINE(const shared_ptr<string> exchangeID) {
        return 0 != this->shfe_ine_set.count(exchangeID->data());
    }

private:
    unordered_set<string> shfe_ine_set = {"SHFE", "INE"}; // 平今仓, 平昨仓
    
};

using TraderUPtr = unique_ptr<ITraderApi>;