#pragma once
#include <net_base.h>
#include <util.h>
#include <vector>
#include <mutex>
#include <string>
#include "file_oper.h"
#include <of_util.h>

using namespace ofen;
struct DownClientInfo {
    std::vector<std::string> files;
    std::string id;
};

enum TransState {
    TRANS_FAILE,
    TRANS_ING,
    TRANS_REDAY,
    TRANS_DONE
};

struct TransInfomation {
    std::string cur_remote_id_;
    std::string cur_remote_file_;
    std::string cur_file_;
    FILE* file_{};
    TransState trans_state_{TRANS_FAILE};
};

class CClient
{
public:
    CClient(const std::shared_ptr<spdlog::logger>& logger);
    ~CClient();

public:
    void run(const std::string& ip, const std::string& port);

public:
    bool get_task_list();
    bool down_task(const std::string& param);
    bool up_task(const std::string& cmd);
    bool cancel_task();
    bool down_one_file(const std::string& id, const std::string& file);
    void cancel_trans_file(const std::string& key = "");

private:
    bool send_frame(CFrameBuffer* buf);

private:
    void handle_frame(CFrameBuffer* buf);
    void send_file_data_th();

private:
    std::shared_ptr<spdlog::logger> logger_;
    asio::io_context io_context_;
    std::shared_ptr<CTcpClient> client_;
    std::vector<std::string> supported_;
    std::map<int, std::shared_ptr<DownClientInfo>> task_list_;
    std::shared_ptr<TransInfomation> down_;
    std::map<std::string, std::shared_ptr<TransInfomation>> up_;
    std::mutex mutex_;
    std::shared_ptr<CThreadPool> send_pool_;
    std::string work_key_;
};