//
//  MockAnalyticsService.swift
//  lichunWebsocketTests
//
//  Mock analytics service for testing without Firebase
//

import Foundation
@testable import lichunWebsocket

// MARK: - Analytics Service Protocol
protocol AnalyticsServiceProtocol {
    func logEvent(_ name: String, parameters: [String: Any]?)
    func setUserID(_ userID: String?)
    func setUserProperty(_ value: String?, forName name: String)
    func setAnalyticsCollectionEnabled(_ enabled: Bool)
}

// MARK: - Mock Analytics Service
class MockAnalyticsService: AnalyticsServiceProtocol {
    // Track all logged events
    var loggedEvents: [(name: String, parameters: [String: Any]?)] = []

    // Track user ID
    var userID: String?

    // Track user properties
    var userProperties: [String: String?] = [:]

    // Track analytics state
    var isAnalyticsEnabled: Bool = true

    // Track if methods were called
    var logEventCalled = false
    var setUserIDCalled = false
    var setUserPropertyCalled = false
    var setAnalyticsCollectionEnabledCalled = false

    func logEvent(_ name: String, parameters: [String: Any]?) {
        logEventCalled = true
        guard isAnalyticsEnabled else { return }
        loggedEvents.append((name: name, parameters: parameters))
    }

    func setUserID(_ userID: String?) {
        setUserIDCalled = true
        self.userID = userID
    }

    func setUserProperty(_ value: String?, forName name: String) {
        setUserPropertyCalled = true
        userProperties[name] = value
    }

    func setAnalyticsCollectionEnabled(_ enabled: Bool) {
        setAnalyticsCollectionEnabledCalled = true
        isAnalyticsEnabled = enabled
    }

    // MARK: - Helper Methods for Testing

    /// Reset all tracked data
    func reset() {
        loggedEvents.removeAll()
        userID = nil
        userProperties.removeAll()
        isAnalyticsEnabled = true
        logEventCalled = false
        setUserIDCalled = false
        setUserPropertyCalled = false
        setAnalyticsCollectionEnabledCalled = false
    }

    /// Check if a specific event was logged
    func hasLoggedEvent(named eventName: String) -> Bool {
        return loggedEvents.contains { $0.name == eventName }
    }

    /// Get parameters for a specific event (returns first match)
    func parameters(for eventName: String) -> [String: Any]? {
        return loggedEvents.first { $0.name == eventName }?.parameters
    }

    /// Get count of how many times an event was logged
    func eventCount(for eventName: String) -> Int {
        return loggedEvents.filter { $0.name == eventName }.count
    }
}
