"""Hashcash proof-of-work (librespot algoritması) — AYRI modül.

ProcessPoolExecutor worker'ları submit edilen fonksiyonu bu modülden import eder.
Ana modül (spotifyHesapAcici_request.py) import-anında ağır iş yapıyor (14k profil
JSON'u, vs.); PoW worker'ları o maliyeti ödemesin diye PoW burada izole tutuluyor.

Saf-Python SHA1 döngüsü CPU-bound'dur ve GIL'i bırakmaz → bu yüzden thread'lerle
değil, SÜREÇ havuzuyla (process pool) paralelleştirilir.
"""
import hashlib


def _trailing_zero_bits(digest):
    """digest'in sonundaki (LSB) sıfır bit sayısı."""
    zeros = 0
    for byte in reversed(digest):
        if byte == 0:
            zeros += 8
            continue
        while not (byte & 1):
            zeros += 1
            byte >>= 1
        break
    return zeros


def solve_hash_cash(ctx, prefix, length):
    """SHA1(prefix+suffix) sonunda >= length sıfır bit olan 16 baytlık suffix bul.
    clienttoken için ctx boştur (b'')."""
    md = hashlib.sha1(ctx).digest()
    target = int.from_bytes(md[12:20], "big", signed=True)
    mask = 0xFFFFFFFFFFFFFFFF
    counter = 0
    while True:
        suffix = (((target + counter) & mask).to_bytes(8, "big")
                  + (counter & mask).to_bytes(8, "big"))
        if _trailing_zero_bits(hashlib.sha1(prefix + suffix).digest()) >= length:
            return suffix
        counter += 1
