import Testing
import Foundation
@testable import nahbar

@Suite("ConversationSuggestionResult")
struct ConversationSuggestionTests {

    let service = AIAnalysisService.shared

    // MARK: - Parsing

    @Test("Alle drei Sektionen werden korrekt extrahiert")
    func parsesAllThreeSections() {
        let input = """
        THEMEN: Erinnerst du dich an euren Wandertrip letzten Herbst? Frag nach den Fotos.
        GESPRAECHSRETTER: Stell eine offene Frage zu ihrer Arbeit. Erzähl von deiner letzten Begegnung mit X.
        TIEFE: Frag sie, was ihr aktuell am meisten Energie gibt – das öffnet meist viele Türen.
        """
        let result = service.parseConversationResult(input)
        #expect(result.topics.contains("Wandertrip"))
        #expect(result.rescue.contains("offene Frage"))
        #expect(result.depth.contains("Energie"))
    }

    @Test("Fettdruck-Markierungen werden vor dem Parsing normalisiert")
    func normalizesBoldMarkers() {
        let input = """
        **THEMEN:** Letzte Reise gemeinsam besprechen.
        **GESPRAECHSRETTER:** Nach dem Haustier fragen.
        **TIEFE:** Frag nach einem Traum oder Ziel.
        """
        let result = service.parseConversationResult(input)
        #expect(!result.topics.isEmpty)
        #expect(!result.rescue.isEmpty)
        #expect(!result.depth.isEmpty)
    }

    @Test("Alternativer Fettdruck-Stil wird ebenfalls normalisiert")
    func normalizesAlternativeBoldStyle() {
        let input = """
        **THEMEN**: Thema eins.
        **GESPRAECHSRETTER**: Rettungsanker.
        **TIEFE**: Tiefer gehen.
        """
        let result = service.parseConversationResult(input)
        #expect(!result.topics.isEmpty)
        #expect(!result.rescue.isEmpty)
        #expect(!result.depth.isEmpty)
    }

    @Test("Fehlende Sektion gibt leeren String zurück (kein Crash)")
    func missingRescueSectionReturnsEmpty() {
        let input = """
        THEMEN: Nur dieses Thema.
        TIEFE: Nur diese Tiefe.
        """
        let result = service.parseConversationResult(input)
        #expect(!result.topics.isEmpty)
        #expect(result.rescue.isEmpty)
        #expect(!result.depth.isEmpty)
    }

    @Test("Vollständig leere Eingabe gibt drei leere Strings zurück")
    func emptyInputReturnsAllEmpty() {
        let result = service.parseConversationResult("")
        #expect(result.topics.isEmpty)
        #expect(result.rescue.isEmpty)
        #expect(result.depth.isEmpty)
    }

    @Test("Mehrzeiliger Sektionsinhalt bleibt vollständig erhalten")
    func multilineTopicsPreserved() {
        let input = """
        THEMEN: Zeile 1
        Zeile 2
        Zeile 3
        GESPRAECHSRETTER: Rettung.
        TIEFE: Tiefe.
        """
        let result = service.parseConversationResult(input)
        #expect(result.topics.contains("Zeile 1"))
        #expect(result.topics.contains("Zeile 2"))
    }

    // MARK: - Codable Round-Trip

    @Test("CachedConversationSuggestion Codable Round-Trip")
    func cacheRoundTrip() throws {
        let original = ConversationSuggestionResult(
            topics: "Reise besprechen",
            rescue: "Nach Hobbys fragen",
            depth:  "Was gibt dir Energie?"
        )
        let cached = CachedConversationSuggestion(result: original, date: Date(timeIntervalSince1970: 1_000_000))
        let data = try JSONEncoder().encode(cached)
        let decoded = try JSONDecoder().decode(CachedConversationSuggestion.self, from: data)

        #expect(decoded.topics == original.topics)
        #expect(decoded.rescue == original.rescue)
        #expect(decoded.depth  == original.depth)
        #expect(decoded.generatedAt.timeIntervalSince1970 == 1_000_000)
    }

    @Test("asResult gibt korrekte ConversationSuggestionResult zurück")
    func asResultRoundTrip() {
        let original = ConversationSuggestionResult(
            topics: "Thema A",
            rescue: "Rettung B",
            depth:  "Tiefe C"
        )
        let cached = CachedConversationSuggestion(result: original)
        let result = cached.asResult
        #expect(result.topics == "Thema A")
        #expect(result.rescue == "Rettung B")
        #expect(result.depth  == "Tiefe C")
    }
}
