#include "Tool.h"
#include <string.h>
#include <chrono>
#include <ctime>
using namespace std;

Tool::Tool(/* args */)
{
}

Tool::~Tool()
{
}

int Tool::ByteLittleToInt(unsigned char *Count)
{
    int int1 = Count[0] & 0xff;
    int int2 = (Count[1] & 0xff) << 8;
    int int3 = (Count[2] & 0xff) << 16;
    int int4 = (Count[3] & 0xff) << 24;

    return int1 | int2 | int3 | int4;
}

unsigned char *Tool::IntToByteLittle(int Count)
{
    unsigned char *b = new unsigned char[4];
    b[0] = (Count & 0xff);
    b[1] = (Count & 0xff00) >> 8;
    b[2] = (Count & 0xff0000) >> 16;
    b[3] = (Count & 0xff000000) >> 24;

    return b;
}

unsigned char *Tool::StringToByte(std::string str)
{
    char *cstr = (char *)str.c_str();
    int Count = strlen(cstr);
    unsigned char *temp = IntToByteLittle(Count);
    unsigned char *buffer = new unsigned char[Count + 4];
    for (size_t i = 0; i < 4; i++)
    {
        buffer[i] = temp[i];
    }
    delete[] temp;
    for (size_t z = 4; z < Count + 4; z++)
    {
        buffer[z] = cstr[z - 4];
    }
    return buffer;
}

void Tool::Error(std::string O)
{
#ifdef Development_mode
    std::cout << "\n----[ERROR]----\n";
    std::cout << "\n----[By "
              << "YosinLenheart"
              << "]----\n";
    std::cout << O << std::endl;
    std::cout << "\n----------------\n";
#endif
}
void Tool::Warring(std::string W)
{
#ifdef Development_mode
    std::cout << "\n----[WARRING]----\n";
    std::cout << "\n----[By "
              << "YosinLenheart"
              << "]----\n";
    std::cout << W << std::endl;
    std::cout << "\n----------------\n";
#endif
}
void Tool::Logger(std::string L)
{
#ifdef Development_mode
    std::cout << "\n----[LOGGER]----\n";
    std::cout << "\n----[By "
              << "YosinLenheart"
              << "]----\n";
    std::cout << L << std::endl;
    std::cout << "\n----------------\n";
#endif
}

void Tool::Split(const std::string &src, std::vector<std::string> &dest, const std::string &separator)
{
    std::string str = src;
    std::string substring;
    std::string::size_type start = 0, index;
    dest.clear();
    index = str.find_first_of(separator, start);
    do
    {
        if (index != std::string::npos)
        {
            substring = str.substr(start, index - start);
            dest.push_back(substring);
            start = index + separator.size();
            index = str.find(separator, start);
            if (start == std::string::npos)
                break;
        }
    } while (index != std::string::npos);

    // the last part
    substring = str.substr(start);
    dest.push_back(substring);
}

long long Tool::get_cur_time()
{
    // 获取操作系统当前时间点（精确到微秒）
    chrono::time_point<chrono::system_clock, chrono::microseconds> tpMicro = chrono::time_point_cast<chrono::microseconds>(chrono::system_clock::now());
    // (微秒精度的)时间点 => (微秒精度的)时间戳
    time_t totalMicroSeconds = tpMicro.time_since_epoch().count();

    long long currentTime = ((long long)totalMicroSeconds) / 1000;

    return currentTime;
}

int Tool::UTF8ToGB2312(char *szSrc, size_t iSrcLen, char *szDst, size_t iDstLen)
{
    iconv_t cd = iconv_open("gb2312//IGNORE", "utf-8//IGNORE"); // take care of "//IGNORE", it will ignore those invalid code
    if (0 == cd)
        return -2;
    memset(szDst, 0, iDstLen);
    char **src = &szSrc;
    char **dst = &szDst;
    if (-1 == (int)iconv(cd, src, &iSrcLen, dst, &iDstLen))
        return -1;
    iconv_close(cd);
    return 0;
}
int Tool::GB2312ToUTF8(char *szSrc, size_t iSrcLen, char *szDst, size_t iDstLen)
{
    iconv_t cd = iconv_open("utf-8//IGNORE", "gb2312//IGNORE");
    if (0 == cd)
        return -2;
    memset(szDst, 0, iDstLen);
    char **src = &szSrc;
    char **dst = &szDst;
    if (-1 == (int)iconv(cd, src, &iSrcLen, dst, &iDstLen))
        return -1;
    iconv_close(cd);
    return 0;
}
