/*
GenerateBloomFilter — erzeugt `bloom_filter.plist` für die NEURLFilter-Extension.

Nutzt die vendorten Apple-Bloom-Dateien (`BloomFilter.swift`, `Murmur3Hash.swift`,
`FNV1aHash.swift` aus `../ios/RebreakURLFilterExtension/`) — dadurch ist die
Erzeugung byte-identisch zu dem, was die Extension dekodiert und der iOS-
NEURLFilter erwartet.

Kompilieren + ausführen:
  xcrun swiftc \
    ../ios/RebreakURLFilterExtension/BloomFilter.swift \
    ../ios/RebreakURLFilterExtension/Murmur3Hash.swift \
    ../ios/RebreakURLFilterExtension/FNV1aHash.swift \
    GenerateBloomFilter.swift -o /tmp/genbloom
  /tmp/genbloom <domains.txt> <out.plist> [falsePositiveTolerance]

`<domains.txt>`: eine Domain/URL pro Zeile (ASCII-Hostnamen; Leerzeilen werden
übersprungen). Der Output ist ein XML-Property-List der `BloomFilter`-Struct.
*/

import Foundation

@main
struct GenerateBloomFilter {
    static func main() throws {
        let args = CommandLine.arguments
        guard args.count >= 3 else {
            FileHandle.standardError.write(Data(
                "usage: genbloom <domains.txt> <out.plist> [falsePositiveTolerance=0.001]\n".utf8))
            exit(2)
        }
        let inPath = args[1]
        let outPath = args[2]
        let fpr = args.count >= 4 ? (Double(args[3]) ?? 0.001) : 0.001

        let raw = try String(contentsOfFile: inPath, encoding: .utf8)
        let domains = raw
            .split(whereSeparator: \.isNewline)
            .map { $0.trimmingCharacters(in: .whitespacesAndNewlines) }
            .filter { !$0.isEmpty }
        guard !domains.isEmpty else {
            FileHandle.standardError.write(Data("error: keine Domains in \(inPath)\n".utf8))
            exit(1)
        }

        let filter = try BloomFilter(items: domains, falsePositiveTolerance: fpr)

        let encoder = PropertyListEncoder()
        encoder.outputFormat = .xml
        let data = try encoder.encode(filter)
        try data.write(to: URL(fileURLWithPath: outPath), options: [.atomic])

        FileHandle.standardError.write(Data("\(filter)\n".utf8))
        print("bloom_filter.plist geschrieben: \(outPath) — \(data.count) Bytes, \(domains.count) Domains, FPR \(fpr)")
    }
}
