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.ZoomVideoSDKRemoteCameraControlHelper;
import us.zoom.sdk.ZoomVideoSDKUser;

public class RNZoomVideoSdkRemoteCameraControlHelperModule extends ReactContextBaseJavaModule {

  private final ReactApplicationContext reactContext;

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

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

  private ZoomVideoSDKRemoteCameraControlHelper getRemoteCameraControlHelper(String userId) {
    ZoomVideoSDKRemoteCameraControlHelper remoteCameraControlHelper = null;
    try {
      ZoomVideoSDKUser user = RNZoomVideoSdkUserModule.getUser(userId);
      remoteCameraControlHelper = user.getRemoteCameraControlHelper();
      if (remoteCameraControlHelper == null) {
        throw new Exception("No Remote Camera Control Helper Found");
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
    return remoteCameraControlHelper;
  }

  @ReactMethod
  public void requestControlRemoteCamera(String userId, Promise promise) {
    promise.resolve(RNZoomVideoSDKErrors.valueOf(getRemoteCameraControlHelper(userId).requestControlRemoteCamera()));
  }

  @ReactMethod
  public void giveUpControlRemoteCamera(String userId, Promise promise) {
    promise.resolve(RNZoomVideoSDKErrors.valueOf(getRemoteCameraControlHelper(userId).giveUpControlRemoteCamera()));
  }

  @ReactMethod
  public void turnLeft(String userId, int range, Promise promise) {
    if (Utils.checkRNActivity(reactContext, promise)) {
      return;
    }
    reactContext.getCurrentActivity().runOnUiThread(new Runnable() {
      @Override
      public void run() {
        promise.resolve(RNZoomVideoSDKErrors.valueOf(getRemoteCameraControlHelper(userId).turnLeft(range)));
      }
    });
  }

  @ReactMethod
  public void turnRight(String userId, int range, Promise promise) {
    if (Utils.checkRNActivity(reactContext, promise)) {
      return;
    }
    reactContext.getCurrentActivity().runOnUiThread(new Runnable() {
      @Override
      public void run() {
        promise.resolve(RNZoomVideoSDKErrors.valueOf(getRemoteCameraControlHelper(userId).turnRight(range)));
      }
    });
  }

  @ReactMethod
  public void turnDown(String userId, int range, Promise promise) {
    if (Utils.checkRNActivity(reactContext, promise)) {
      return;
    }
    reactContext.getCurrentActivity().runOnUiThread(new Runnable() {
      @Override
      public void run() {
        promise.resolve(RNZoomVideoSDKErrors.valueOf(getRemoteCameraControlHelper(userId).turnDown(range)));
      }
    });
  }

  @ReactMethod
  public void turnUp(String userId, int range, Promise promise) {
    if (Utils.checkRNActivity(reactContext, promise)) {
      return;
    }
    reactContext.getCurrentActivity().runOnUiThread(new Runnable() {
      @Override
      public void run() {
        promise.resolve(RNZoomVideoSDKErrors.valueOf(getRemoteCameraControlHelper(userId).turnUp(range)));
      }
    });
  }

  @ReactMethod
  public void zoomIn(String userId, int range, Promise promise) {
    if (Utils.checkRNActivity(reactContext, promise)) {
      return;
    }
    reactContext.getCurrentActivity().runOnUiThread(new Runnable() {
      @Override
      public void run() {
        promise.resolve(RNZoomVideoSDKErrors.valueOf(getRemoteCameraControlHelper(userId).zoomIn(range)));
      }
    });
  }

  @ReactMethod
  public void zoomOut(String userId, int range, Promise promise) {
    if (Utils.checkRNActivity(reactContext, promise)) {
      return;
    }
    reactContext.getCurrentActivity().runOnUiThread(new Runnable() {
      @Override
      public void run() {
        promise.resolve(RNZoomVideoSDKErrors.valueOf(getRemoteCameraControlHelper(userId).zoomOut(range)));
      }
    });
  }

}
