/*
 DomainHasher — Swift-Port von
 `android/.../filter/DomainHasher.kt`.

 Domain-Hashing — IDENTISCH zu `server/utils/domainHash.ts` und der Android-
 Implementierung. Produziert die ersten 8 Bytes des SHA-256 als big-endian
 UInt64. Der 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.
*/

import Foundation
import CryptoKit

enum DomainHasher {

  /// Normalisiert einen Hostname analog zu Server + Android.
  ///  - lowercase
  ///  - http(s):// strippen
  ///  - Pfad/Query/Anchor (alles ab erstem `/`) abschneiden
  ///  - leading "www." entfernen
  ///
  /// Muss BIT-IDENTISCH zu `DomainHasher.kt#normalize` bleiben, sonst matchen
  /// die Hashes nicht gegen die vom Server generierte `blocklist.bin`.
  static func normalize(_ host: String) -> String {
    var h = host.trimmingCharacters(in: .whitespacesAndNewlines).lowercased()
    if h.hasPrefix("https://") {
      h = String(h.dropFirst(8))
    } else if h.hasPrefix("http://") {
      h = String(h.dropFirst(7))
    }
    if let slash = h.firstIndex(of: "/") {
      h = String(h[h.startIndex..<slash])
    }
    if h.hasPrefix("www.") {
      h = String(h.dropFirst(4))
    }
    return h
  }

  /// SHA-256(normalize(host)).first(8) als big-endian UInt64.
  ///
  /// Bit-Pattern identisch zu Kotlins `ByteBuffer.order(BIG_ENDIAN).long`
  /// und zum Server. Die ersten 8 Bytes des Digest werden big-endian
  /// interpretiert.
  static func hash(_ host: String) -> UInt64 {
    let normalized = normalize(host)
    let digest = SHA256.hash(data: Data(normalized.utf8))
    var result: UInt64 = 0
    var i = 0
    for byte in digest {
      result = (result << 8) | UInt64(byte)
      i += 1
      if i == 8 { break }
    }
    return result
  }
}
