import APIClient
import CoreMedia
import Foundation

/// API designed for ergonomic callsites:
/// .track(.audioAction(.songLikeTapped, me: Me, clip: Clip)))
public enum AnalyticsEvent {
    case onboardingAction(OnboardingActionRoute)
    case audioAction(
        AudioActionRoute,
        clip: Clip,
        playbackMetadata: PlaybackMetadata = PlaybackMetadata()
    )
    case audioCreation
    case general(GeneralRoute)

    public enum OnboardingActionRoute {
        case signInWithPhoneTapped
        case signInWithAppleTapped
        case signInWithGoogleTapped
        case signInWithMicrosoftTapped
        case signInWithDiscordTapped
        case userSignedUp
        case userLoggedIn
        case userLoggedOut
    }

    public enum AudioActionRoute {
        // Playback actions
        case playNewSong
        case playSongTapped
        case pauseSongTapped
        case restartSongTapped
        case playNextSong
        case playPreviousSong
        case autoplayNextSong
        case endOfQueue
        case seekFinished
        // Song meta-actions
        case songLikeTapped
        case songUndoLikeTapped
        case songDislikeTapped
        case songUndoDislikeTapped
        case shareSongScreenOpened
        case shareSongScreenClosed
        case shareSongTapped(shareType: String)
        case songActionsTapped
        case omniplayerExpanded
        case omniplayerClosed
        case omniplayerGenerateMore
    }

    public enum GeneralRoute {
        case inAppReviewPopupShown(description: String)
        case inAppReviewPopupRatingRequested(description: String)
        case inAppReviewPopupDismissed(description: String)
        case contactSyncBannerTapped
        case contactSyncBannerDismissed
        case inviteFriendsBannerTapped
        case inviteFriendsBannerDismissed
        case inviteShareTapped(shareType: String)
    }
}

public struct PlaybackMetadata: Codable {
    let isPlaying: Bool?
    let elapsedTime: Float64?
    let totalTime: Float64?
    let fromCommandCenter: Bool?
    let omniplayerIsExpanded: Bool?

    public init(
        isPlaying: Bool,
        elapsedTime: CMTime,
        totalTime: CMTime,
        fromCommandCenter: Bool = false,
        omniplayerIsExpanded: Bool? = nil
    ) {
        self.isPlaying = isPlaying
        self.elapsedTime = CMTimeGetSeconds(elapsedTime)
        self.totalTime = CMTimeGetSeconds(totalTime)
        self.fromCommandCenter = fromCommandCenter
        self.omniplayerIsExpanded = omniplayerIsExpanded
    }

    public init() {
        self.isPlaying = nil
        self.elapsedTime = nil
        self.totalTime = nil
        self.fromCommandCenter = nil
        self.omniplayerIsExpanded = nil
    }
}
