package expo.modules.rebreakprotection.filter

import java.nio.ByteBuffer
import java.nio.ByteOrder
import java.security.MessageDigest

/**
 * Domain-Hashing — IDENTISCH zu `server/utils/domainHash.ts` und iOS' `DomainHasher.swift`.
 *
 * Produziert die ersten 8 Bytes des SHA-256 als big-endian UInt64.
 * Server liefert die Hash-Liste in dieser Form, iOS und Android lesen sie 1:1.
 *
 * Privacy: arbeitet rein lokal — keine Klartext-Domain verlässt das Gerät.
 */
object DomainHasher {

    /**
     * Normalisiert einen Hostname analog zu Server + iOS.
     *  - lowercase
     *  - http(s):// strippen
     *  - Pfad/Query/Anchor (alles ab erstem `/`) abschneiden
     *  - leading "www." entfernen
     */
    fun normalize(host: String): String {
        var h = host.trim().lowercase()
        if (h.startsWith("https://")) h = h.substring(8)
        else if (h.startsWith("http://")) h = h.substring(7)
        val slash = h.indexOf('/')
        if (slash >= 0) h = h.substring(0, slash)
        if (h.startsWith("www.")) h = h.substring(4)
        return h
    }

    /**
     * SHA-256(normalize(host)).first(8) als big-endian UInt64.
     * Returnt Long (Kotlin hat kein UInt64) — bit-pattern identisch zu UInt64-BE.
     */
    fun hash(host: String): Long {
        val normalized = normalize(host)
        val digest = MessageDigest.getInstance("SHA-256").digest(normalized.toByteArray(Charsets.UTF_8))
        return ByteBuffer.wrap(digest, 0, 8).order(ByteOrder.BIG_ENDIAN).long
    }
}
