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.WritableMap;
import com.reactnativezoom.videosdk.convert.RNZoomVideoSDKErrors;
import com.reactnativezoom.videosdk.convert.RNZoomVideoSdkExportFormat;

import us.zoom.sdk.ZoomVideoSDK;
import us.zoom.sdk.ZoomVideoSDKErrors;
import us.zoom.sdk.ZoomVideoSDKShareHelper;
import us.zoom.sdk.ZoomVideoSDKWhiteboardHelper;
import us.zoom.sdk.ZoomVideoSDKExportFormat;

public class RNZoomVideoSdkWhiteboardHelperModule extends ReactContextBaseJavaModule {

  private final ReactApplicationContext reactContext;

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

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

  private ZoomVideoSDKWhiteboardHelper getWhiteboardHelper() {
    ZoomVideoSDKWhiteboardHelper whiteboardHelper = null;
    try {
      ZoomVideoSDKShareHelper shareHelper = ZoomVideoSDK.getInstance().getShareHelper();
      if (shareHelper == null) {
        throw new Exception("No Share Helper Found");
      }
      whiteboardHelper = shareHelper.getWhiteboardHelper();
      if (whiteboardHelper == null) {
        throw new Exception("No Whiteboard Helper Found");
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
    return whiteboardHelper;
  }

  @ReactMethod
  public void canStartShareWhiteboard(Promise promise) {
    ZoomVideoSDKWhiteboardHelper whiteboardHelper = getWhiteboardHelper();
    if (whiteboardHelper == null) {
      promise.resolve(false);
      return;
    }
    promise.resolve(whiteboardHelper.canStartShareWhiteboard());
  }

  @ReactMethod
  public void canStopShareWhiteboard(Promise promise) {
    ZoomVideoSDKWhiteboardHelper whiteboardHelper = getWhiteboardHelper();
    if (whiteboardHelper == null) {
      promise.resolve(false);
      return;
    }
    promise.resolve(whiteboardHelper.canStopShareWhiteboard());
  }

  @ReactMethod
  public void startShareWhiteboard(Promise promise) {
    if (Utils.checkRNActivity(reactContext, promise)) {
      return;
    }
    reactContext.getCurrentActivity().runOnUiThread(new Runnable() {
      @Override
      public void run() {
        ZoomVideoSDKWhiteboardHelper whiteboardHelper = getWhiteboardHelper();
        if (whiteboardHelper == null) {
          promise.reject("whiteboard_helper_error", "Whiteboard helper not available", (WritableMap) null);
          return;
        }
        promise.resolve(RNZoomVideoSDKErrors.valueOf(whiteboardHelper.startShareWhiteboard()));
      }
    });
  }

  @ReactMethod
  public void stopShareWhiteboard(Promise promise) {
    if (Utils.checkRNActivity(reactContext, promise)) {
      return;
    }
    reactContext.getCurrentActivity().runOnUiThread(new Runnable() {
      @Override
      public void run() {
        ZoomVideoSDKWhiteboardHelper whiteboardHelper = getWhiteboardHelper();
        if (whiteboardHelper == null) {
          promise.reject("whiteboard_helper_error", "Whiteboard helper not available", (WritableMap) null);
          return;
        }
        promise.resolve(RNZoomVideoSDKErrors.valueOf(whiteboardHelper.stopShareWhiteboard()));
      }
    });
  }

  @ReactMethod
  public void isOtherSharingWhiteboard(Promise promise) {
    ZoomVideoSDKWhiteboardHelper whiteboardHelper = getWhiteboardHelper();
    if (whiteboardHelper == null) {
      promise.resolve(false);
      return;
    }
    promise.resolve(whiteboardHelper.isOtherSharingWhiteboard());
  }

  @ReactMethod
  public void exportWhiteboard(String format, Promise promise) {
    if (Utils.checkRNActivity(reactContext, promise)) {
      return;
    }
    reactContext.getCurrentActivity().runOnUiThread(new Runnable() {
      @Override
      public void run() {
        ZoomVideoSDKWhiteboardHelper whiteboardHelper = getWhiteboardHelper();
        if (whiteboardHelper == null) {
          promise.reject("whiteboard_helper_error", "Whiteboard helper not available", (WritableMap) null);
          return;
        }
        ZoomVideoSDKExportFormat exportFormat = RNZoomVideoSdkExportFormat.valueOf(format);
        if (exportFormat == null) {
          promise.reject("invalid_format", "Invalid export format: " + format, (WritableMap) null);
          return;
        }
        promise.resolve(RNZoomVideoSDKErrors.valueOf(whiteboardHelper.exportWhiteboard(exportFormat)));
      }
    });
  }

}
