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.reactnativezoom.videosdk.convert.RNZoomVideoSDKErrors;

import us.zoom.sdk.ZoomVideoSDK;
import us.zoom.sdk.ZoomVideoSDKBroadcastStreamingController;

public class RNZoomVideoSdkBroadcastStreamingHelperModule extends ReactContextBaseJavaModule {

    private final ReactApplicationContext reactContext;

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

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

    private ZoomVideoSDKBroadcastStreamingController getController() {
        ZoomVideoSDKBroadcastStreamingController controller = null;
        try {
            controller = ZoomVideoSDK.getInstance().getBroadcastStreamingController();
            if (controller == null) {
                throw new Exception("Broadcast streaming controller is not available");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return controller;
    }

    @ReactMethod
    public void isBroadcastStreamingSupported(Promise promise) {
        ZoomVideoSDKBroadcastStreamingController controller = getController();
        promise.resolve(controller != null && controller.isBroadcastStreamingSupported());
    }

    @ReactMethod
    public void canStartBroadcast(Promise promise) {
        ZoomVideoSDKBroadcastStreamingController controller = getController();
        promise.resolve(controller != null && controller.canStartBroadcast());
    }

    @ReactMethod
    public void startBroadcast(Promise promise) {
        if (Utils.checkRNActivity(reactContext, promise)) {
            return;
        }
        reactContext.getCurrentActivity().runOnUiThread(new Runnable() {
            @Override
            public void run() {
                ZoomVideoSDKBroadcastStreamingController controller = getController();
                if (controller == null) {
                    promise.resolve(null);
                    return;
                }
                promise.resolve(RNZoomVideoSDKErrors.valueOf(controller.startBroadcast()));
            }
        });
    }

    @ReactMethod
    public void stopBroadcast(String channelID, Promise promise) {
        if (Utils.checkRNActivity(reactContext, promise)) {
            return;
        }
        reactContext.getCurrentActivity().runOnUiThread(new Runnable() {
            @Override
            public void run() {
                ZoomVideoSDKBroadcastStreamingController controller = getController();
                if (controller == null) {
                    promise.resolve(null);
                    return;
                }
                promise.resolve(RNZoomVideoSDKErrors.valueOf(controller.stopBroadcast(channelID)));
            }
        });
    }

    @ReactMethod
    public void getBroadcastStatus(String channelID, Promise promise) {
        ZoomVideoSDKBroadcastStreamingController controller = getController();
        if (controller == null) {
            promise.resolve(null);
            return;
        }
        promise.resolve(RNZoomVideoSDKErrors.valueOf(controller.getBroadcastStatus(channelID)));
    }
}
