/**
  ******************************************************************************
  * @file           : Utils.cpp
  * @author         : Dream
  * @brief          : None
  * @attention      : None
  * @date           : 24-10-3
  ******************************************************************************
  */

#include "Utils.hpp"
#include <openssl/evp.h>
#include <sstream>
#include <iomanip>
#include <chrono>
#include <cstdlib>
#include <format>
#include <random>

// 生成 MD5 签名
std::string Utils::generate_md5(const std::string& data) {
    unsigned char digest[EVP_MAX_MD_SIZE];
    unsigned int digest_len;

    const EVP_MD* md = EVP_md5();
    EVP_MD_CTX* ctx = EVP_MD_CTX_new();

    EVP_DigestInit_ex(ctx, md, nullptr);
    EVP_DigestUpdate(ctx, data.data(), data.size());
    EVP_DigestFinal_ex(ctx, digest, &digest_len);
    EVP_MD_CTX_free(ctx);

    std::ostringstream md5stream;
    for (unsigned int i = 0; i < digest_len; ++i) {
        md5stream << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(digest[i]);
    }
    return md5stream.str();
}


// 生成随机数值
std::string Utils::generate_value(time_t &timestamp) {
    // 获取高精度时间戳（纳秒级）
    auto now = std::chrono::system_clock::now();
    timestamp = std::chrono::system_clock::to_time_t(now);
    auto ns = std::chrono::duration_cast<std::chrono::nanoseconds>(
        now.time_since_epoch()).count();

    // 使用 mt19937 随机数生成器
    static std::mt19937 rng(std::random_device{}());
    std::uniform_int_distribution<int> dist(0, 999999);

    // 使用 format 安全拼接字符串
    return std::format("{}{:06d}", ns, dist(rng));
}
