//
//  FireworkSdk+EventTracking.swift
//  react-native-firework-sdk
//
//  Created by Jeff Zheng on 2021/12/21.
//

import FireworkVideo
import Foundation

extension FireworkSDKModule: FireworkVideoPlaybackDelegate {
    func fireworkVideoDidRecordImpression(_ videoPlayback: VideoPlaybackDetails) {
        guard enableVideoPlayBackEvent else { return }
        sendEvent(
            withName: FWEventName.videoPlayback.rawValue,
            body: [
                "eventName": VideoPlaybackSubEventName.impression.rawValue,
                "info": videoPlayback.jsObject
            ])
    }

    func fireworkVideoDidStartPlaying(_ videoPlayback: VideoPlaybackDetails) {
        guard enableVideoPlayBackEvent else { return }
        sendEvent(
            withName: FWEventName.videoPlayback.rawValue,
            body: [
                "eventName": VideoPlaybackSubEventName.start.rawValue,
                "info": videoPlayback.jsObject
            ])
    }

    func fireworkVideoDidPause(_ videoPlayback: VideoPlaybackDetails) {
        guard enableVideoPlayBackEvent else { return }
        sendEvent(
            withName: FWEventName.videoPlayback.rawValue,
            body: [
                "eventName": VideoPlaybackSubEventName.pause.rawValue,
                "info": videoPlayback.jsObject
            ])
    }

    func fireworkVideoDidResume(_ videoPlayback: VideoPlaybackDetails) {
        guard enableVideoPlayBackEvent else { return }
        sendEvent(
            withName: FWEventName.videoPlayback.rawValue,
            body: [
                "eventName": VideoPlaybackSubEventName.resume.rawValue,
                "info": videoPlayback.jsObject
            ])
    }

    func fireworkVideoReachedFirstQuartile(_ videoPlayback: VideoPlaybackDetails) {
        guard enableVideoPlayBackEvent else { return }
        sendEvent(
            withName: FWEventName.videoPlayback.rawValue,
            body: [
                "eventName": VideoPlaybackSubEventName.firstQuartile.rawValue,
                "info": videoPlayback.jsObject
            ])
    }

    func fireworkVideoReachedMidPoint(_ videoPlayback: VideoPlaybackDetails) {
        guard enableVideoPlayBackEvent else { return }
        sendEvent(
            withName: FWEventName.videoPlayback.rawValue,
            body: [
                "eventName": VideoPlaybackSubEventName.midpoint.rawValue,
                "info": videoPlayback.jsObject
            ])
    }

    func fireworkVideoReachedThirdQuartile(_ videoPlayback: VideoPlaybackDetails) {
        guard enableVideoPlayBackEvent else { return }
        sendEvent(
            withName: FWEventName.videoPlayback.rawValue,
            body: [
                "eventName": VideoPlaybackSubEventName.thirdQuartile.rawValue,
                "info": videoPlayback.jsObject
            ])
    }

    func fireworkVideoDidFinishPlaying(_ videoPlayback: VideoPlaybackDetails) {
        guard enableVideoPlayBackEvent else { return }
        sendEvent(
            withName: FWEventName.videoPlayback.rawValue,
            body: [
                "eventName": VideoPlaybackSubEventName.complete.rawValue,
                "info": videoPlayback.jsObject
            ])
    }

    func fireworkVideoDidStartPlayingAd(_ videoPlayback: VideoPlaybackDetails) {
        guard enableVideoPlayBackEvent else { return }
        sendEvent(
            withName: FWEventName.videoPlayback.rawValue,
            body: [
                "eventName": VideoPlaybackSubEventName.adStart.rawValue,
                "info": videoPlayback.jsObject
            ])
    }

    func fireworkVideoDidFinishPlayingAd(_ videoPlayback: VideoPlaybackDetails) {
        guard enableVideoPlayBackEvent else { return }
        sendEvent(
            withName: FWEventName.videoPlayback.rawValue,
            body: [
                "eventName": VideoPlaybackSubEventName.adEnd.rawValue,
                "info": videoPlayback.jsObject
            ])
    }

    func fireworkVideoDidTapCTAButton(_ videoPlayback: VideoPlaybackDetails) {
        guard enableVideoPlayBackEvent else { return }
        sendEvent(
            withName: FWEventName.videoPlayback.rawValue,
            body: [
                "eventName": VideoPlaybackSubEventName.clickCTA.rawValue,
                "info": videoPlayback.jsObject
            ])
    }

    func fireworkVideoDidTapShareButton(_ videoPlayback: VideoPlaybackDetails) {
        guard enableVideoPlayBackEvent else { return }
        sendEvent(
            withName: FWEventName.videoPlayback.rawValue,
            body: [
                "eventName": VideoPlaybackSubEventName.clickShare.rawValue,
                "info": videoPlayback.jsObject
            ])
    }

    func fireworkVideoDidClose(_ videoPlayback: VideoPlaybackDetails) {
        guard enableVideoPlayBackEvent else { return }
        sendEvent(
            withName: FWEventName.videoPlayback.rawValue,
            body: [
                "eventName": VideoPlaybackSubEventName.complete.rawValue,
                "info": videoPlayback.jsObject
            ])
    }

    func fireworkVideoDidAutomaticallyPause(_ videoPlayback: VideoPlaybackDetails) {
        guard enableVideoPlayBackEvent else { return }
        sendEvent(
            withName: FWEventName.videoPlayback.rawValue,
            body: [
                "eventName": VideoPlaybackSubEventName.pause.rawValue,
                "info": videoPlayback.jsObject
            ])
    }

    func fireworkVideoDidAutomaticallyResume(_ videoPlayback: VideoPlaybackDetails) {
        guard enableVideoPlayBackEvent else { return }
        sendEvent(
            withName: FWEventName.videoPlayback.rawValue,
            body: [
                "eventName": VideoPlaybackSubEventName.resume.rawValue,
                "info": videoPlayback.jsObject
            ])
    }
}

extension FireworkSDKModule: FireworkVideoFeedDelegate {
    func fireworkVideoDidTapThumbnail(_ eventDetails: FeedEventDetails) {
        sendEvent(
            withName: FWEventName.videoFeedClick.rawValue, body: ["info": eventDetails.jsObject])
    }
}

extension FireworkSDKModule {
    @objc(setDataTrackingLevel:resolver:rejecter:)
    func setDataTrackingLevel(
        _ level: String,
        resolver: @escaping RCTPromiseResolveBlock,
        rejecter: @escaping RCTPromiseRejectBlock
    ) {
      if let dataTrackingLevel = RCTConvert.dataTrackingLevel(level) {
          FireworkVideoSDK.dataTrackingLevel = dataTrackingLevel
          resolver(true)
      } else {
          resolver(false)
      }
    }
}
