#pragma once

#include <spdlog/spdlog.h>
#include <spdlog/sinks/basic_file_sink.h>
#include <iostream>
#include <string>
#include <memory>
#include <map>

using namespace std;

class ConfigMakerCore
{
public:
    ConfigMakerCore() = delete;

    ConfigMakerCore(string marketDepthDataConfigPath);

    virtual ~ConfigMakerCore();

public:
    void Parser();

    void DumpMainContractsJson();

private:
    bool Check();

    bool InitSourceTradingTimeMap();

    bool IsInDaySession(const std::string& time, const std::vector<std::string>& timeRange);

    bool IsInNightSession(const std::string& time, const std::vector<std::string>& timeRange);

    bool IsTradingTime(const string& exchangeInstru, const std::string& time);

    string GetExchangeInstru(const string& exchangeInstrument);

    string GetMainContractsDailyPath();

private:
    shared_ptr<string> m_marketDepthDataConfigPath;
    shared_ptr<string> m_marketDepthDataCSVPath;

    shared_ptr<string> m_sourceTradingTimeConfigPath;

    shared_ptr<spdlog::logger> m_coreLogger;

    shared_ptr<string> m_csvName;

    map<string, map<string, vector<vector<string>>>> m_sourceTradingTimeMap;
    map<string, map<string, string>> m_mainContractsMap;
};