import AnalyticsClient
import ComposableArchitecture

extension SongActions {
    struct Analytics: AnalyticsReducer {
        var source: String = "song_actions"

        // swiftlint:disable:next cyclomatic_complexity function_body_length
        func analytics(before: State, after _: State, action: Action) -> Effect<Action> {
            switch action {
            case .createHookTapped:
                track(
                    Event(
                        category: .create,
                        actionName: .createHookTapped,
                        actionType: .tap,
                        elementType: .clip,
                        elementId: before.clip.id.remoteId
                    )
                )

            case .reportInappropriateTapped:
                track(
                    Event(
                        category: .general,
                        actionName: .reportInappropriateTapped,
                        actionType: .tap,
                        elementType: .clip,
                        elementId: before.clip.id.remoteId
                    )
                )

            case .remixReuseTapped:
                track(
                    Event(
                        category: .create,
                        actionName: .reuseTapped,
                        actionType: .tap,
                        elementType: .clip,
                        elementId: before.clip.id.remoteId
                    )
                )

            case .addToPlaylistTapped:
                track(
                    Event(
                        category: .general,
                        actionName: .addToPlaylistTapped,
                        actionType: .tap,
                        elementType: .clip,
                        elementId: before.clip.id.remoteId
                    )
                )

            case .togglePrivacyTapped:
                track(
                    Event(
                        category: .general,
                        actionName: before.clip.isPublic ? .makePrivateTapped : .makePublicTapped,
                        actionType: .tap,
                        elementType: .clip,
                        elementId: before.clip.id.remoteId
                    )
                )

            case .downloadTapped:
                track(
                    Event(
                        category: .general,
                        actionName: .downloadSongTapped,
                        actionType: .tap,
                        elementType: .clip,
                        elementId: before.clip.id.remoteId
                    )
                )

            case .downloadVideoTapped:
                track(
                    Event(
                        category: .general,
                        actionName: .downloadVideoTapped,
                        actionType: .tap,
                        elementType: .clip,
                        elementId: before.clip.id.remoteId
                    )
                )

            case .remasterTapped:
                track(
                    Event(
                        category: .create,
                        actionName: .remasterTapped,
                        actionType: .tap,
                        elementType: .clip,
                        elementId: before.clip.id.remoteId
                    )
                )

            case .remixExtendTapped:
                track(
                    Event(
                        category: .create,
                        actionName: .extendSongActionTapped,
                        actionType: .tap,
                        elementType: .clip,
                        elementId: before.clip.id.remoteId
                    )
                )

            case .remixCoverTapped:
                track(
                    Event(
                        category: .create,
                        actionName: .coverSongActionTapped,
                        actionType: .tap,
                        elementType: .clip,
                        elementId: before.clip.id.remoteId
                    )
                )

            case .replaceSongArtTapped:
                track(
                    Event(
                        category: .clipDetails,
                        actionName: .replaceSongArtSongActionTapped,
                        actionType: .tap,
                        elementType: .clip,
                        elementId: before.clip.id.remoteId
                    )
                )

            case .editSongDetailsTapped:
                track(
                    Event(
                        category: .clipDetails,
                        actionName: .editSongDetailsSongActionTapped,
                        actionType: .tap,
                        elementType: .clip,
                        elementId: before.clip.id.remoteId
                    )
                )

            case .publishTapped:
                track(
                    Event(
                        category: .clipDetails,
                        actionName: .publishSongActionTapped,
                        actionType: .tap,
                        elementType: .clip,
                        elementId: before.clip.id.remoteId
                    )
                )

            case .toggleLike:
                let originalLikedState = before.clip.isLiked

                // Clip was liked (before), press to unlike
                if originalLikedState {
                    track(
                        Event(
                            category: .songActions,
                            actionName: .songActionsUndoLikeTapped,
                            actionType: .tap,
                            elementType: .clip,
                            elementId: before.clip.id.remoteId
                        )
                    )
                } else {
                    track(
                        Event(
                            category: .songActions,
                            actionName: .songActionsLikeTapped,
                            actionType: .tap,
                            elementType: .clip,
                            elementId: before.clip.id.remoteId
                        )
                    )
                }

            case .toggleDislike:
                let originalDislikeState = before.clip.isDisliked

                // Clip was disliked (before), press to undo dislike
                if originalDislikeState {
                    track(
                        Event(
                            category: .songActions,
                            actionName: .songActionsUndoDislikeTapped,
                            actionType: .tap,
                            elementType: .clip,
                            elementId: before.clip.id.remoteId
                        )
                    )
                } else {
                    track(
                        Event(
                            category: .songActions,
                            actionName: .songActionsDislikeTapped,
                            actionType: .tap,
                            elementType: .clip,
                            elementId: before.clip.id.remoteId
                        )
                    )
                }

            case .moreInfoTapped:
                track(
                    Event(
                        category: .songActions,
                        actionName: .songActionsMoreInfoTapped,
                        actionType: .tap
                    )
                )

            case .goToProfile(let handle):
                track(
                    Event(
                        category: .songActions,
                        actionName: .profileTapped,
                        actionType: .tap,
                        elementType: .clip,
                        elementId: before.clip.id.remoteId,
                        context: handle
                    )
                )

            default:
                break
            }
            return .none
        }
    }
}
