import Testing
@testable import nahbar

@Suite("AIPayloadSanitizer")
struct AIPayloadSanitizerTests {

    // MARK: - Sauberer Text

    @Test("Sauberer Text wird unverändert durchgereicht")
    func cleanTextPassesThrough() {
        let text = "Haben uns beim Konzert getroffen, war ein schöner Abend."
        #expect(AIPayloadSanitizer.sanitize(text) == text)
    }

    @Test("Leerer String bleibt leer")
    func emptyStringStaysEmpty() {
        #expect(AIPayloadSanitizer.sanitize("") == "")
    }

    // MARK: - E-Mail

    @Test("E-Mail-Adresse wird maskiert")
    func emailIsMasked() {
        let result = AIPayloadSanitizer.sanitize("Schreib mir an max.muster@example.com bitte.")
        #expect(result.contains("[E-Mail]"))
        #expect(!result.contains("max.muster@example.com"))
    }

    @Test("E-Mail mit Subdomain wird maskiert")
    func emailWithSubdomainIsMasked() {
        let result = AIPayloadSanitizer.sanitize("Kontakt: user@mail.company.de")
        #expect(result.contains("[E-Mail]"))
        #expect(!result.contains("@"))
    }

    @Test("Mehrere E-Mails werden alle maskiert")
    func multipleEmailsAreMasked() {
        let result = AIPayloadSanitizer.sanitize("a@b.de und c@d.com schreiben sich.")
        #expect(!result.contains("@"))
    }

    // MARK: - URL

    @Test("https-URL wird maskiert")
    func httpsURLIsMasked() {
        let result = AIPayloadSanitizer.sanitize("Schau mal: https://www.example.com/path?x=1")
        #expect(result.contains("[Link]"))
        #expect(!result.contains("https://"))
    }

    @Test("http-URL wird maskiert")
    func httpURLIsMasked() {
        let result = AIPayloadSanitizer.sanitize("Infos unter http://example.com")
        #expect(result.contains("[Link]"))
    }

    @Test("www-URL ohne Protokoll wird maskiert")
    func wwwURLIsMasked() {
        let result = AIPayloadSanitizer.sanitize("Besuche www.example.com für Details.")
        #expect(result.contains("[Link]"))
        #expect(!result.contains("www.example.com"))
    }

    // MARK: - IBAN

    @Test("Unformatierte IBAN wird maskiert")
    func ibanWithoutSpacesIsMasked() {
        let result = AIPayloadSanitizer.sanitize("Konto: DE89370400440532013000")
        #expect(result.contains("[IBAN]"))
        #expect(!result.contains("DE89"))
    }

    // MARK: - Telefonnummern

    @Test("Internationale Rufnummer (+49) wird maskiert")
    func internationalPhoneIsMasked() {
        let result = AIPayloadSanitizer.sanitize("Ruf mich an: +49 30 12345678")
        #expect(result.contains("[Telefon]"))
        #expect(!result.contains("+49"))
    }

    @Test("Deutsche Mobilnummer wird maskiert")
    func germanMobileIsMasked() {
        let result = AIPayloadSanitizer.sanitize("Tel: 01512345678")
        #expect(result.contains("[Telefon]"))
        #expect(!result.contains("01512345678"))
    }

    @Test("Deutsche Festnetznummer mit Trenner wird maskiert")
    func germanLandlineWithSeparatorIsMasked() {
        let result = AIPayloadSanitizer.sanitize("Erreichbar unter 030 12345678.")
        #expect(result.contains("[Telefon]"))
    }

    @Test("Jahreszahl (4-stellig) wird NICHT als Telefon maskiert")
    func yearIsNotMasked() {
        let result = AIPayloadSanitizer.sanitize("Wir kennen uns seit 2019.")
        #expect(!result.contains("[Telefon]"))
        #expect(result.contains("2019"))
    }

    // MARK: - Lange Zahlenfolgen

    @Test("8-stellige Zahl wird als [Nummer] maskiert")
    func eightDigitNumberIsMasked() {
        let result = AIPayloadSanitizer.sanitize("Ausweis: 12345678")
        #expect(result.contains("[Nummer]"))
        #expect(!result.contains("12345678"))
    }

    @Test("5-stellige PLZ wird NICHT als [Nummer] maskiert")
    func postalCodeIsNotMasked() {
        let result = AIPayloadSanitizer.sanitize("Wohnt in 80331 München.")
        #expect(!result.contains("[Nummer]"))
        #expect(result.contains("80331"))
    }

    @Test("7-stellige Zahl wird NICHT maskiert")
    func sevenDigitNumberIsNotMasked() {
        let result = AIPayloadSanitizer.sanitize("Referenz: 1234567")
        #expect(!result.contains("[Nummer]"))
    }

    // MARK: - Kombiniert

    @Test("Mehrere PII-Typen im selben Text werden alle maskiert")
    func multiplePIITypesAreMasked() {
        let text = "Kontakt: hans@test.de, Tel: +49 151 12345678, IBAN: DE89370400440532013000"
        let result = AIPayloadSanitizer.sanitize(text)
        #expect(!result.contains("hans@test.de"))
        #expect(!result.contains("+49"))
        #expect(!result.contains("DE89"))
        #expect(result.contains("[E-Mail]"))
        #expect(result.contains("[Telefon]"))
    }

    @Test("Vorname bleibt erhalten")
    func firstNameIsPreserved() {
        let result = AIPayloadSanitizer.sanitize("Treffen mit Maria war schön.")
        #expect(result.contains("Maria"))
    }
}
