#include "hash.hpp"
#define XXH_INLINE_ALL
#include "xxhash.hpp"
#include <fstream>
#include <sstream>
#include <iomanip>

static std::string to_hex64(uint64_t value) {
    std::ostringstream oss;
    oss << std::hex << std::setw(16) << std::setfill('0') << value;
    return oss.str();
}

std::string hash_data(const std::string& data) {
    uint64_t h = XXH3_64bits(data.data(), data.size());
    return to_hex64(h);
}

std::string hash_file(const std::string& path) {
    std::ifstream file(path, std::ios::binary);
    if (!file) return "";
    XXH64_state_t* state = XXH64_createState();
    XXH64_reset(state, 0);
    char buf[4096];
    while (file) {
        file.read(buf, sizeof(buf));
        std::streamsize n = file.gcount();
        if (n > 0) XXH64_update(state, buf, static_cast<size_t>(n));
    }
    uint64_t h = XXH64_digest(state);
    XXH64_freeState(state);
    return to_hex64(h);
} 