import Testing
import Foundation
@testable import nahbar

// MARK: - TourSeenStore Tests

@Suite("TourSeenStore – Grundfunktionen")
struct TourSeenStoreTests {

    /// Creates an isolated UserDefaults for each test to avoid state leakage.
    private func makeStore() -> TourSeenStore {
        let suiteName = "test.tour.\(UUID().uuidString)"
        let defaults = UserDefaults(suiteName: suiteName)!
        return TourSeenStore(defaults: defaults)
    }

    @Test("hasSeen gibt false zurück bevor markSeen aufgerufen wurde")
    func hasSeenFalseInitially() {
        let store = makeStore()
        #expect(!store.hasSeen(.onboarding))
    }

    @Test("markSeen setzt hasSeen auf true")
    func markSeenSetsHasSeen() {
        let store = makeStore()
        store.markSeen(.onboarding)
        #expect(store.hasSeen(.onboarding))
    }

    @Test("markSeen für eine ID beeinflusst andere IDs nicht")
    func markSeenDoesNotAffectOtherIDs() {
        let store = makeStore()
        store.markSeen(.onboarding)
        #expect(!store.hasSeen(.v1_2_besuchsfragebogen))
        #expect(!store.hasSeen(.v1_3_personality))
    }

    @Test("Mehrfaches markSeen ist idempotent")
    func markSeenIsIdempotent() {
        let store = makeStore()
        store.markSeen(.onboarding)
        store.markSeen(.onboarding)
        #expect(store.hasSeen(.onboarding))
    }

    @Test("reset setzt hasSeen zurück auf false")
    func resetClearsSeenIDs() {
        let store = makeStore()
        store.markSeen(.onboarding)
        store.reset()
        #expect(!store.hasSeen(.onboarding))
    }

    @Test("reset löscht auch lastSeenAppVersion")
    func resetClearsLastSeenVersion() {
        let store = makeStore()
        store.lastSeenAppVersion = "1.2"
        store.reset()
        #expect(store.lastSeenAppVersion == nil)
    }

    @Test("lastSeenAppVersion ist initial nil")
    func lastSeenVersionIsInitiallyNil() {
        let store = makeStore()
        #expect(store.lastSeenAppVersion == nil)
    }

    @Test("lastSeenAppVersion wird korrekt geschrieben und gelesen")
    func lastSeenVersionPersists() {
        let store = makeStore()
        store.lastSeenAppVersion = "1.3"
        #expect(store.lastSeenAppVersion == "1.3")
    }
}

@Suite("TourSeenStore – Persistenz")
struct TourSeenStorePersistenceTests {

    @Test("markSeen persistiert über Store-Neuinstanzierung")
    func persistenceAcrossInstances() {
        let suiteName = "test.tour.persist.\(UUID().uuidString)"
        let defaults = UserDefaults(suiteName: suiteName)!

        let store1 = TourSeenStore(defaults: defaults)
        store1.markSeen(.onboarding)

        // New instance, same defaults
        let store2 = TourSeenStore(defaults: defaults)
        #expect(store2.hasSeen(.onboarding))

        // Cleanup
        defaults.removePersistentDomain(forName: suiteName)
    }

    @Test("lastSeenAppVersion persistiert über Store-Neuinstanzierung")
    func versionPersistenceAcrossInstances() {
        let suiteName = "test.tour.version.\(UUID().uuidString)"
        let defaults = UserDefaults(suiteName: suiteName)!

        let store1 = TourSeenStore(defaults: defaults)
        store1.lastSeenAppVersion = "2.0"

        let store2 = TourSeenStore(defaults: defaults)
        #expect(store2.lastSeenAppVersion == "2.0")

        // Cleanup
        defaults.removePersistentDomain(forName: suiteName)
    }
}
