package com.reactnativezoom.videosdk;

import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.ReadableMap;
import com.reactnativezoom.videosdk.convert.RNZoomVideoSDKErrors;
import com.reactnativezoom.videosdk.convert.RNZoomVideoSdkStreamingJoinStatus;

import android.util.Log;

import us.zoom.sdk.ZoomVideoSDK;
import us.zoom.sdk.ZoomVideoSDKBroadcastStreamingViewer;
import us.zoom.sdk.ZoomVideoSDKSteamingJoinContext;

public class RNZoomVideoSdkBroadcastStreamingViewerModule extends ReactContextBaseJavaModule {

    private final ReactApplicationContext reactContext;

    RNZoomVideoSdkBroadcastStreamingViewerModule(ReactApplicationContext reactContext) {
        super(reactContext);
        this.reactContext = reactContext;
    }

    @Override
    public String getName() {
        return "RNZoomVideoSdkBroadcastStreamingViewer";
    }

    private ZoomVideoSDKBroadcastStreamingViewer getViewer() {
        ZoomVideoSDKBroadcastStreamingViewer viewer = null;
        try {
            viewer = ZoomVideoSDK.getInstance().getBroadcastStreamingViewer();
            if (viewer == null) {
                throw new Exception("Broadcast streaming viewer is not available");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return viewer;
    }

    @ReactMethod
    public void joinStreaming(ReadableMap ctx, Promise promise) {
        if (Utils.checkRNActivity(reactContext, promise)) {
            return;
        }
        reactContext.getCurrentActivity().runOnUiThread(new Runnable() {
            @Override
            public void run() {
                ZoomVideoSDKBroadcastStreamingViewer viewer = getViewer();
                if (viewer == null) {
                    promise.resolve(null);
                    return;
                }
                ZoomVideoSDKSteamingJoinContext joinContext = new ZoomVideoSDKSteamingJoinContext();
                if (ctx.hasKey("token")) {
                    joinContext.token = ctx.getString("token");
                }
                if (ctx.hasKey("channelID")) {
                    joinContext.channelID = ctx.getString("channelID");
                }
                int tokenLen = joinContext.token != null ? joinContext.token.length() : 0;
                Log.d("RNZoomBSViewer", "joinStreaming bridge call: tokenLen=" + tokenLen + " channelID=" + joinContext.channelID);
                int err = viewer.joinStreaming(joinContext);
                Log.d("RNZoomBSViewer", "joinStreaming returned: " + err);
                promise.resolve(RNZoomVideoSDKErrors.valueOf(err));
            }
        });
    }

    @ReactMethod
    public void leaveStreaming(Promise promise) {
        if (Utils.checkRNActivity(reactContext, promise)) {
            return;
        }
        reactContext.getCurrentActivity().runOnUiThread(new Runnable() {
            @Override
            public void run() {
                ZoomVideoSDKBroadcastStreamingViewer viewer = getViewer();
                if (viewer == null) {
                    promise.resolve(null);
                    return;
                }
                promise.resolve(RNZoomVideoSDKErrors.valueOf(viewer.leaveStreaming()));
            }
        });
    }

    @ReactMethod
    public void getStreamingJoinStatus(Promise promise) {
        ZoomVideoSDKBroadcastStreamingViewer viewer = getViewer();
        if (viewer == null) {
            promise.resolve(null);
            return;
        }
        promise.resolve(RNZoomVideoSdkStreamingJoinStatus.valueOf(viewer.getStreamingJoinStatus()));
    }
}
