"""MurmurHash64A used by PoE bundle index since patch 3.21.2 (seed 0x1337b33f)."""
from __future__ import annotations

SEED = 0x1337B33F
_M = 0xC6A4A7935BD1E995
_R = 47


def murmurhash64a(data: bytes, seed: int = SEED) -> int:
    h = (seed ^ (len(data) * _M)) & 0xFFFFFFFFFFFFFFFF
    nblocks = len(data) // 8
    for i in range(nblocks):
        k = int.from_bytes(data[i * 8 : i * 8 + 8], "little")
        k = (k * _M) & 0xFFFFFFFFFFFFFFFF
        k ^= k >> _R
        k = (k * _M) & 0xFFFFFFFFFFFFFFFF
        h ^= k
        h = (h * _M) & 0xFFFFFFFFFFFFFFFF
    tail = data[nblocks * 8 :]
    if tail:
        k = int.from_bytes(tail.ljust(8, b"\x00"), "little")
        h ^= k
        h = (h * _M) & 0xFFFFFFFFFFFFFFFF
    h ^= h >> _R
    h = (h * _M) & 0xFFFFFFFFFFFFFFFF
    h ^= h >> _R
    return h


def hash_bundle_path(path: str) -> int:
    return murmurhash64a(path.replace("\\", "/").lower().encode("ascii", "ignore"))
