package com.reactnativezoom.videosdk;

import com.facebook.react.bridge.Arguments;
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.ReadableArray;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.bridge.WritableArray;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.bridge.WritableNativeArray;

import java.util.List;

import us.zoom.sdk.ZoomVideoSDK;
import us.zoom.sdk.ZoomVideoSDKSession;
import us.zoom.sdk.ZoomVideoSDKUser;
import us.zoom.sdk.ZoomVideoSDKVideoCanvas;
import us.zoom.sdk.ZoomVideoSDKShareAction;
import us.zoom.sdk.ZoomVideoSDKWhiteboardStatus;
import com.reactnativezoom.videosdk.convert.RNZoomVideoSdkShareAction;
import com.reactnativezoom.videosdk.convert.RNZoomVideoSdkWhiteboardStatus;

public class RNZoomVideoSdkUserModule extends ReactContextBaseJavaModule {

  private final ReactApplicationContext reactContext;

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

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

  public static ZoomVideoSDKUser getUser(String userId) {
    ZoomVideoSDKUser user;
    ZoomVideoSDKSession session = ZoomVideoSDK.getInstance().getSession();
    ZoomVideoSDKUser myUser = session.getMySelf();

    if (myUser.getUserID().equals(userId)) {
      user = myUser;
    } else {
      user = session.getRemoteUsers()
        .stream()
        .filter(u -> u.getUserID().equals(userId))
        .findAny()
        .orElse(null);
    }
    return user;
  }

  public static ReadableArray mapUserArray(List<ZoomVideoSDKUser> userList) {
    WritableArray mappedUserArray = new WritableNativeArray();
    for (ZoomVideoSDKUser user : userList) {
      mappedUserArray.pushMap(mapUser(user));
    }
    return mappedUserArray;
  }

  public static ReadableMap mapUser(ZoomVideoSDKUser user) {
    WritableMap mappedUser = Arguments.createMap();
    mappedUser.putString("userId", user.getUserID());
    mappedUser.putString("customUserId", user.getCustomIdentity());
    mappedUser.putString("userName", user.getUserName());
    mappedUser.putBoolean("isHost", user.isHost());
    mappedUser.putBoolean("isManager", user.isManager());
    return mappedUser;
  }

  @ReactMethod
  public void getUserName(String userId, Promise promise) {
    ZoomVideoSDKUser user = RNZoomVideoSdkUserModule.getUser(userId);
    if (user != null) {
      promise.resolve(user.getUserName());
    }
  }

  @ReactMethod
  public void isHost(String userId, Promise promise) {
    ZoomVideoSDKUser user = RNZoomVideoSdkUserModule.getUser(userId);
    if (user != null) {
      promise.resolve(user.isHost());
    }
  }

  @ReactMethod
  public void isManager(String userId, Promise promise) {
    ZoomVideoSDKUser user = RNZoomVideoSdkUserModule.getUser(userId);
    if (user != null) {
      promise.resolve(user.isManager());
    }
  }

  @ReactMethod
  public void getMultiCameraCanvasList(String userId, Promise promise) {
    ZoomVideoSDKUser user = RNZoomVideoSdkUserModule.getUser(userId);
    if (user != null) {
      promise.resolve(user.getMultiCameraCanvasList());
    }
  }

  @ReactMethod
  public void getUserVolume(String userId, boolean isSharingAudio, Promise promise) {
    ZoomVideoSDKUser user = RNZoomVideoSdkUserModule.getUser(userId);
    if (user != null) {
      promise.resolve(user.getUserVolume(isSharingAudio));
    }
  }

  @ReactMethod
  public void setUserVolume(String userId, float volume, boolean isSharingAudio, Promise promise) {
    ZoomVideoSDKUser user = RNZoomVideoSdkUserModule.getUser(userId);
    if (user != null) {
      promise.resolve(user.setUserVolume(volume, isSharingAudio));
    }
  }

  @ReactMethod
  public void canSetUserVolume(String userId, boolean isSharingAudio, Promise promise) {
    ZoomVideoSDKUser user = RNZoomVideoSdkUserModule.getUser(userId);
    if (user != null) {
      promise.resolve(user.canSetUserVolume(isSharingAudio));
    }
  }

  @ReactMethod
  public void hasIndividualRecordingConsent(String userId, Promise promise) {
    ZoomVideoSDKUser user = RNZoomVideoSdkUserModule.getUser(userId);
    if (user != null) {
      promise.resolve(user.hasIndividualRecordingConsent());
    }
  }

  @ReactMethod
  public void getUserReference(String userId, Promise promise) {
    ZoomVideoSDKUser user = RNZoomVideoSdkUserModule.getUser(userId);
    if (user != null) {
      promise.resolve(user.getUserGUID());
    }
  }


  @ReactMethod
  public void getShareActionList(String userId, Promise promise) {
    ZoomVideoSDKUser user = getUser(userId);
    if (user != null) {
      List<ZoomVideoSDKShareAction> shareActionList = user.getShareActionList();
      promise.resolve(RNZoomVideoSdkShareAction.mapShareActionArray(shareActionList));
    }
  }

  @ReactMethod
  public void isInSubSession(String userId, Promise promise) {
    ZoomVideoSDKUser user = getUser(userId);
    if (user != null) {
      promise.resolve(user.isInSubSession());
    }
  }

  @ReactMethod
  public void getWhiteboardStatus(String userId, Promise promise) {
    ZoomVideoSDKUser user = getUser(userId);
    if (user != null) {
      ZoomVideoSDKWhiteboardStatus status = user.getWhiteboardStatus();
      promise.resolve(RNZoomVideoSdkWhiteboardStatus.valueOf(status));
    }
  }
}
