import AnalyticsClient
import ComposableArchitecture

extension VideoTrimmer {
    struct Analytics: AnalyticsReducer {
        var source: String = "create_clip_v2_video_trimmer"

        struct TrimmedVideoMetaData: Codable {
            let startTimeSeconds: Double
            let endTimeSeconds: Double
            let leftHandlePosition: Double
            let rightHandlePosition: Double
            let trimmedDuration: Double
            let totalDuration: Double
            let minimumDuration: Double
            let maximumDuration: Double
            let currentTime: Double?
        }

        func analytics(before: State, after _: State, action: Action) -> Effect<Action> { let context: String = TrimmedVideoMetaData(
            startTimeSeconds: before.startTimeSeconds,
            endTimeSeconds: before.endTimeSeconds,
            leftHandlePosition: before.leftHandlePosition,
            rightHandlePosition: before.rightHandlePosition,
            trimmedDuration: before.trimmedDuration,
            totalDuration: before.videoDuration,
            minimumDuration: before.minimumDuration,
            maximumDuration: before.maximumDuration,
            currentTime: before.player?.currentTime().seconds
        ).toString()

        switch action {
        case .togglePlayPause:
            if before.isPlaying {
                track(
                    Event(
                        category: .create,
                        actionName: .pauseTapped,
                        actionType: .tap,
                        elementType: .button,
                        context: context
                    )
                )
            } else {
                track(
                    Event(
                        category: .create,
                        actionName: .playTapped,
                        actionType: .tap,
                        elementType: .button,
                        context: context
                    )
                )
            }

        case .dismiss:
            track(
                Event(
                    category: .create,
                    actionName: .dismissTapped,
                    actionType: .tap,
                    elementType: .toolbarButton,
                    context: context
                )
            )

        case .save:
            track(
                Event(
                    category: .create,
                    actionName: .saveTapped,
                    actionType: .tap,
                    elementType: .toolbarButton,
                    context: context
                )
            )

        case .handleDragEnd:
            track(
                Event(
                    category: .create,
                    actionName: .dragEnded,
                    actionType: .tap,
                    elementType: .toolbarButton,
                    context: context
                )
            )

        case .delegate(.showDurationError):
            track(
                Event(
                    category: .create,
                    actionName: .showDurationError,
                    elementType: .alert,
                    context: context
                )
            )

        default:
            break
        }
        return .none
        }
    }
}
