import AnalyticsClient
import APIClient
import ComposableArchitecture
import Foundation
import Utilities

extension HooksGridReducer {
    struct Analytics: AnalyticsReducer {
        var source: String = "hooks_grid"

        func analytics(before: State, after _: State, action: Action) -> Effect<Action> {
            switch action {
            case .hookCardTapped(let hook):
                let hookIndex = before.hooks.firstIndex(where: { $0.id == hook.id }) ?? 0
                track(
                    Event(
                        category: .hooksPlayer,
                        actionName: .hookCardTapped,
                        actionType: .tap,
                        elementType: .hook,
                        elementId: hook.id,
                        context: createHookAnalyticsContextWithIndex(hook: hook, index: hookIndex, source: before.source).toJsonString()
                    )
                )

            case .hookMoreTapped(let hook):
                track(
                    Event(
                        category: .hooksPlayer,
                        actionName: .menuTapped, // More menu tapped in grid
                        actionType: .tap,
                        elementType: .hook,
                        elementId: hook.id,
                        context: createHookAnalyticsContext(hook: hook, source: before.source).toJsonString()
                    )
                )

            case .createHookTapped:
                track(
                    Event(
                        category: .hooksPlayer,
                        actionName: .createHookTapped,
                        actionType: .tap,
                        elementType: .button,
                        context: createGridAnalyticsContext(source: before.source).toJsonString()
                    )
                )

            default:
                break
            }
            return .none
        }

        private func createHookAnalyticsContext(hook: Hook, source: HooksFeedSource) -> HookAnalyticsContext {
            let analytics = source.analyticsContext
            return hook.analyticsContext(
                contextType: analytics.contextType,
                contextId: analytics.contextId,
                sourceUrl: analytics.sourceUrl
            )
        }

        private func createHookAnalyticsContextWithIndex(hook: Hook, index: Int, source: HooksFeedSource) -> HookGridAnalyticsContext {
            let analytics = source.analyticsContext
            let baseContext = hook.analyticsContext(
                contextType: analytics.contextType,
                contextId: analytics.contextId
            )
            return HookGridAnalyticsContext(
                recommendationItemId: baseContext.recommendationItemId,
                contextType: baseContext.contextType,
                contextId: baseContext.contextId,
                gridIndex: index
            )
        }

        private func createGridAnalyticsContext(source: HooksFeedSource) -> HookAnalyticsContext {
            let analytics = source.analyticsContext
            return HookAnalyticsContext(
                recommendationItemId: nil,
                contextType: HookAnalyticsContext.mapContextType(analytics.contextType),
                contextId: analytics.contextId
            )
        }
    }
}

// MARK: - Grid-specific Analytics Context

struct HookGridAnalyticsContext: Codable {
    let recommendationItemId: String?
    let contextType: String
    let contextId: String?
    let gridIndex: Int

    func toJsonString() -> String {
        guard let data = try? JSONEncoder().encode(self),
              let jsonString = String(data: data, encoding: .utf8)
        else {
            return "{}"
        }
        return jsonString
    }
}
