import AnalyticsClient
import ComposableArchitecture
import Utilities

extension OmniPlayerReducer {
    struct Analytics: AnalyticsReducer {
        var source: String = "omni_player_v3"

        // swiftlint:disable:next cyclomatic_complexity function_body_length
        func analytics(before: State, after _: State, action: Action) -> Effect<Action> {
            switch action {
            case .expanded(.likeTapped):
                let isLiked = before.player.clip.isLiked == true
                let actionName = isLiked ? Event.ActionName.omniplayerLikeTapped : Event.ActionName.omniplayerUndoLikeTapped
                track(
                    Event(
                        category: .omniPlayer,
                        actionName: actionName,
                        actionType: .tap,
                        elementId: before.player.clip.id.remoteId,
                        context: PlaybackMetadata(
                            isPlaying: before.isPlaying,
                            elapsedTime: before.player.elapsedTime,
                            totalTime: before.player.totalTime,
                            omniplayerIsExpanded: false
                        ).toString()
                    )
                )

            case .expanded(.dislikeTapped):
                let isDisliked = before.player.clip.isDisliked == true
                let actionName = isDisliked ? Event.ActionName.omniplayerUndoDislikeTapped : Event.ActionName.omniplayerDislikeTapped
                track(
                    Event(
                        category: .omniPlayer,
                        actionName: actionName,
                        actionType: .tap,
                        elementId: before.player.clip.id.remoteId,
                        context: PlaybackMetadata(
                            isPlaying: before.isPlaying,
                            elapsedTime: before.player.elapsedTime,
                            totalTime: before.player.totalTime,
                            omniplayerIsExpanded: false
                        ).toString()
                    )
                )

            case .openCommentsInExpandedPlayer:
                track(
                    Event(
                        category: .omniPlayer,
                        actionName: Event.ActionName.omniplayerOpenedForComment,
                        actionType: .tap,
                        elementType: .clip,
                        elementId: before.player.clip.id.remoteId,
                        context: PlaybackMetadata(
                            isPlaying: before.isPlaying,
                            elapsedTime: before.player.elapsedTime,
                            totalTime: before.player.totalTime,
                            omniplayerIsExpanded: false
                        ).toString()
                    )
                )

            case .expanded(.generateMoreTapped):
                track(
                    Event(
                        category: .omniPlayer,
                        actionName: Event.ActionName.omniplayerGenerateMore,
                        actionType: .tap,
                        elementType: .clip,
                        elementId: before.player.clip.id.remoteId,
                        context: PlaybackMetadata(
                            isPlaying: before.isPlaying,
                            elapsedTime: before.player.elapsedTime,
                            totalTime: before.player.totalTime,
                            omniplayerIsExpanded: false
                        ).toString()
                    )
                )

            case .expanded(.editPromptTapped):
                track(
                    Event(
                        category: .omniPlayer,
                        actionName: Event.ActionName.omniplayerEditPrompt,
                        actionType: .tap,
                        elementType: .clip,
                        elementId: before.player.clip.id.remoteId,
                        context: PlaybackMetadata(
                            isPlaying: before.isPlaying,
                            elapsedTime: before.player.elapsedTime,
                            totalTime: before.player.totalTime,
                            omniplayerIsExpanded: false
                        ).toString()
                    )
                )

            case .setExpanded(let value, _):
                guard value == false else { break }
                track(
                    Event(
                        category: .omniPlayer,
                        actionName: Event.ActionName.omniPlayerCloseTapped,
                        actionType: .tap,
                        elementType: .clip,
                        elementId: before.player.clip.id.remoteId,
                        context: PlaybackMetadata(
                            isPlaying: before.isPlaying,
                            elapsedTime: before.player.elapsedTime,
                            totalTime: before.player.totalTime,
                            omniplayerIsExpanded: true
                        ).toString()
                    )
                )

            default:
                break
            }

            return .none
        }
    }
}

extension ExpandedPlayerReducer {
    struct Analytics: AnalyticsReducer {
        var source: String = "omni_player_v3"

        func analytics(before: State, after _: State, action: Action) -> Effect<Action> {
            switch action {
            case .didTapSeeMoreChevron:
                track(
                    Event(
                        category: .omniPlayer,
                        actionName: Event.ActionName.omniplayerSeeMoreInfo,
                        actionType: .tap,
                        elementType: .clip,
                        elementId: before.player.clip.id.remoteId
                    )
                )

            case .didScrollToSeeMore:
                track(
                    Event(
                        category: .omniPlayer,
                        actionName: Event.ActionName.omniplayerSeeMoreInfo,
                        actionType: .scroll,
                        elementType: .clip,
                        elementId: before.player.clip.id.remoteId
                    )
                )

            case .moreTapped:
                track(
                    Event(
                        category: .songActions,
                        actionName: .songActionsMenuOptionsTapped,
                    )
                )

            default:
                break
            }

            return .none
        }
    }
}
