//
//  LiveStreamModule.swift
//  react-native-firework-sdk
//
//  Created by Jeff Zheng on 2022/2/16.
//

import FireworkVideo
import Foundation

@objc(LiveStreamModule)
class LiveStreamModule: RCTEventEmitter, FireworkLiveStreamEventDelegate, FireworkLiveStreamBehaviorDelegate {

    private var customLinkInteractionClickEnabled = false

    override func supportedEvents() -> [String]! {
        LiveStreamEventName.allCases.map { $0.rawValue }
    }

    override class func requiresMainQueueSetup() -> Bool {
        return true
    }

    override var methodQueue: DispatchQueue {
        return DispatchQueue.main
    }

    @objc(initializeSDK:rejecter:)
    func initializeSDK(_ resolver: RCTPromiseResolveBlock,
                       rejecter: RCTPromiseRejectBlock) {
        FireworkVideoSDK.eventTracking.liveStreamEventDelegate = self
        FireworkVideoSDK.liveStreamBehaviorDelegate = self
        resolver([:])
    }

    @objc(setCustomLinkInteractionClickEnabled:resolver:rejecter:)
    func setCustomLinkInteractionClickEnabled(_ enabled: Bool,
                                              resolver: RCTPromiseResolveBlock,
                                              rejecter: RCTPromiseRejectBlock) {
        customLinkInteractionClickEnabled = enabled
        resolver([:])
    }

    func fireworkLiveStreamUserDidJoin(_ liveStream: LiveStreamEventDetails) {
        sendEvent(
            withName: LiveStreamEventName.livestream.rawValue,
            body: [
                "eventName": LiveStreamSubEventName.userDidjoin.rawValue,
                "info": liveStream.jsObject
            ])
    }

    func fireworkLiveStreamUserDidLeave(_ liveStream: LiveStreamEventDetails) {
        sendEvent(
            withName: LiveStreamEventName.livestream.rawValue,
            body: [
                "eventName": LiveStreamSubEventName.userDidLeave.rawValue,
                "info": liveStream.jsObject
            ])
    }

    func fireworkLiveStreamUserDidSendChat(
        _ message: LiveStreamMessageDetails, to liveStream: LiveStreamEventDetails
    ) {
        sendEvent(
            withName: LiveStreamEventName.livestreamChat.rawValue,
            body: [
                "eventName": LiveStreamChatSubEventName.userSendChat.rawValue,
                "message": message.jsObject, "liveStream": liveStream.jsObject
            ])
    }

    func fireworkLiveStreamUserDidSendLike(_ liveStream: LiveStreamEventDetails) {
        sendEvent(
            withName: LiveStreamEventName.livestream.rawValue,
            body: [
                "eventName": LiveStreamSubEventName.userSendLike.rawValue,
                "info": liveStream.jsObject
            ])
    }

    func fireworkLiveStream(
        _ liveStream: LiveStreamEventDetails,
        didTapLinkInteraction interaction: LiveStreamLinkInteraction
    ) -> Bool {
        if customLinkInteractionClickEnabled {
            sendEvent(
                withName: LiveStreamEventName.customLinkInteractionClick.rawValue,
                body: [
                    "title": interaction.title,
                    "url": interaction.url,
                    "info": liveStream.jsObject
                ]
            )
        }
        return customLinkInteractionClickEnabled
    }
}
