#pragma once
#include "of_util.h"
#include <cstdint>
#include <functional>
#include <spdlog/sinks/rotating_file_sink.h>
#include <spdlog/sinks/stdout_color_sinks.h>
#include <spdlog/spdlog.h>

constexpr size_t g_BuffSize = 102400;
const size_t MAX_FRAME_SIZE = 10 * g_BuffSize;
enum FrameType : int16_t {
    TYPE_DEFAULT = 0,
    TYPE_GET_LIST,
    TYPE_DOWN_LIST,
    TYPE_UP_LIST,
    TYPE_CANCEL_LIST,
    TYPE_OPEN_FILE,
    TYPE_TRANS_FILE,
    TYPE_TRANS_DONE,
    TYPE_INTERRUPT,
    TYPE_NO_HIT_TASK,
    TYPE_WAITTING,
    TYPE_HEARTS,
    TYPE_OFFLINE,
    TYPE_JUDGE_ACTIVE,
    TYPE_REQUEST_UPDATE_LIST,
    TYPE_CONFIRM_UPDATE_LIST,
    TYPE_UNCONFIRM_UPDATE_LIST,
    TYPE_DONE_UPDATE_LIST,
    TYPE_FAILED_UPDATE_LIST,
    TYPE_GET_ID,
    TYPE_FILE_SIZE
};

using namespace ofen;
std::shared_ptr<spdlog::logger> get_logger(const std::string& mark, const std::string& log_file);
class CFrameBuffer
{
public:
    CFrameBuffer();
    ~CFrameBuffer();

public:
    std::string fid_{};
    std::string tid_{};

public:
    FrameType type_{};
    char* data_{};
    int len_{};
    char mark_{};
};

using ExFun_t = std::function<void(CFrameBuffer* buf)>;
/*
【 transm TCP 数据协议 】
    header 2 char: 0xFF 0xFE
    type   2 char:
    mark   1 char:
    from  32 char:
    to    32 char:
    len    4 char:
    data    xxxxx:
    tail   2 char: 0xFF 0xFF
 */
class CTransProtocal
{
public:
    CTransProtocal();
    ~CTransProtocal();

public:
    static CFrameBuffer* parse(CMutBuffer& buffer);
    static bool pack(CFrameBuffer* buf, char** out_buf, int& len);
    static void display_progress(float percent);
};