import AnalyticsClient
import APIClient
import ComposableArchitecture
import Foundation
import Utilities

extension HookActions {
    struct Analytics: AnalyticsReducer {
        var source: String = "hooks_more_menu"

        func analytics(before: State, after _: State, action: Action) -> Effect<Action> {
            switch action {
            case .goToFullSongTapped:
                var context = createHookAnalyticsContext(hook: before.hook, source: before.source, isUserObjectOwner: before.isMe)
                context.clipId = before.hook.clip?.id.remoteId
                track(
                    Event(
                        category: .hooksPlayer,
                        actionName: .goToFullSongTapped,
                        actionType: .tap,
                        elementType: .hook,
                        elementId: before.hook.id,
                        context: context.toJsonString()
                    )
                )

            case .addToPlaylistTapped:
                var context = createHookAnalyticsContext(hook: before.hook, source: before.source, isUserObjectOwner: before.isMe)
                context.clipId = before.hook.clip?.id.remoteId
                track(
                    Event(
                        category: .hooksPlayer,
                        actionName: .addToPlaylistTapped,
                        actionType: .tap,
                        elementType: .hook,
                        elementId: before.hook.id,
                        context: context.toJsonString()
                    )
                )

            case .shareHookTapped:
                track(
                    Event(
                        category: .hooksPlayer,
                        actionName: .shareTapped,
                        actionType: .tap,
                        elementType: .hook,
                        elementId: before.hook.id,
                        context: createHookAnalyticsContext(hook: before.hook, source: before.source, isUserObjectOwner: before.isMe).toJsonString()
                    )
                )

            case .remixSongTapped:
                var context = createHookAnalyticsContext(hook: before.hook, source: before.source, isUserObjectOwner: before.isMe)
                context.clipId = before.hook.clip?.id.remoteId
                track(
                    Event(
                        category: .hooksPlayer,
                        actionName: .remixTapped,
                        actionType: .tap,
                        elementType: .hook,
                        elementId: before.hook.id,
                        context: createHookAnalyticsContext(hook: before.hook, source: before.source, isUserObjectOwner: before.isMe).toJsonString()
                    )
                )
                
            case .downloadHookTapped:
                var context = createHookAnalyticsContext(hook: before.hook, source: before.source, isUserObjectOwner: before.isMe)
                context.clipId = before.hook.clip?.id.remoteId
                track(
                    Event(
                        category: .hooksPlayer,
                        actionName: .hookDownloadTapped,
                        actionType: .tap,
                        elementType: .hook,
                        elementId: before.hook.id,
                        context: context.toJsonString()
                    )
                )

            default:
                break
            }
            return .none
        }

        private func createHookAnalyticsContext(hook: Hook, source: HooksFeedSource?, isUserObjectOwner: Bool) -> HookAnalyticsContext {
            let targetUserId = hook.user?.externalUserId

            if let source = source {
                let analytics = source.analyticsContext
                return hook.analyticsContext(
                    contextType: analytics.contextType,
                    contextId: analytics.contextId,
                    sourceUrl: analytics.sourceUrl,
                    targetUserId: targetUserId,
                    isUserObjectOwner: isUserObjectOwner
                )
            } else {
                // Fallback when source is not available (e.g., from delayed actions)
                return hook.analyticsContext(
                    contextType: "Unknown",
                    contextId: nil,
                    targetUserId: targetUserId,
                    isUserObjectOwner: isUserObjectOwner
                )
            }
        }
    }
}
