package com.paygilantwrapper;

import androidx.annotation.NonNull;

import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.ReadableArray;
import com.paygilant.PG_FraudDetection_SDK.PaygilantException;
import com.paygilant.PG_FraudDetection_SDK.PaygilantManager;
import com.paygilant.PG_FraudDetection_SDK.PaygilantRunTimeException;
import com.paygilant.PG_FraudDetection_SDK.PaygilantSessionIdCallback;
import com.paygilant.PG_FraudDetection_SDK.UserVerificationCallback;
import com.paygilant.PG_FraudDetection_SDK.pgdata.CrossPlatformType;
import com.paygilant.PG_FraudDetection_SDK.pgdata.CrossPlatformVersion;
import com.facebook.react.bridge.ReadableMap;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;

public class PaygilantWrapperModule extends com.paygilantwrapper.PaygilantWrapperSpec {
  public static final String NAME = "PaygilantWrapper";
  private final ReactApplicationContext reactContext;
    private String reactNativeVersion = ""; // Default or unset state
    private boolean callSetApproveBefore = false;

    PaygilantWrapperModule(ReactApplicationContext context) {
    super(context);
    this.reactContext = context;
  }

  @Override
  @NonNull
  public String getName() {
    return NAME;
  }

  /**
   * Function : init
   */
  @ReactMethod
  public void initialize(String serverURL, String clientSessionId,Boolean toAskPermissions, Promise promise) {
      if (getCurrentActivity() != null && !getCurrentActivity().isDestroyed()) {
          try {
            if( toAskPermissions == null) {
              toAskPermissions = false;
            }
              // Handle optional `clientSessionId` by passing `null` if not provided
              PaygilantManager.init(reactContext,getCurrentActivity(), serverURL, clientSessionId,toAskPermissions,new CrossPlatformVersion(reactNativeVersion, CrossPlatformType.REACT_NATIVE), paygilantResult -> {
                if (paygilantResult.isSuccess()) {
                      promise.resolve(true);
                  } else {
                      promise.reject("error", paygilantResult.getError().toString());
                  }
              });
          } catch (PaygilantException e) {
              promise.reject("error", e.toString());
          }
      }
  }
    @ReactMethod
    public void setReactNativeVersion(String version, Promise promise) {
        reactNativeVersion = version;
        promise.resolve(null); // Resolve immediately as this just sets an internal variable
    }
  @ReactMethod
  public void isApprovePolicy(Promise promise){
    try{
      promise.resolve(PaygilantManager.isApprovePolicy(reactContext));
    }catch (PaygilantRunTimeException e){
      promise.reject("error", e.toString());
    }
  }

  @ReactMethod
  public void getSessionId(Promise promise){
      try{
          PaygilantManager.getInstance(reactContext).getSessionId(sessionId ->
                  promise.resolve(sessionId));
      }catch (PaygilantRunTimeException e){
              promise.resolve("no_session_id");
      }
  }
    @ReactMethod
    public void askPaygilantPermissions(Promise promise){
        try{
            PaygilantManager.getInstance(reactContext).askPaygilantPermissions();
            promise.resolve(null);
        }catch (PaygilantRunTimeException e){
            promise.reject("error", e.toString());
        }
    }

  @ReactMethod
  public void logout(Promise promise){
    try{
      PaygilantManager.getInstance(reactContext).logout();
      promise.resolve(null);
    }catch (PaygilantRunTimeException e){
      promise.reject("error", e.toString());
    }
  }
  /**
   * After the initialize and approve policy process.
   * the app needs to update the SDK with this information.
   * */
  @ReactMethod
  public void setApprovePolicy(boolean approvePolicy,Promise promise) {
      try {
        PaygilantManager.getInstance(reactContext).setApprovePolicy(approvePolicy);
        promise.resolve(null);
      } catch (PaygilantRunTimeException e) {
        promise.reject("error", e.toString());
      }
  }
  @ReactMethod
  public void startNewScreenListener(String type, double screenId,Promise promise) {
      if (!callSetApproveBefore) {
          callSetApproveBefore = true;
          try {
              PaygilantManager.getInstance(reactContext).setApprovePolicy(true);
          } catch (PaygilantRunTimeException e) {
              promise.reject("error", e.toString());
          }
      }
  }
    @ReactMethod
    public void getDeviceId(Promise promise){
        promise.resolve("no_device_id");
    }


      @ReactMethod
  public void startUserVerification(String userId, Promise promise) {
    try {
      PaygilantManager.getInstance(getReactApplicationContext()).startUserVerification(userId, new UserVerificationCallback() {
          @Override
          public void onVerificationResult(boolean b) {
              if (b) {
                  promise.resolve("true");
              } else {
                  promise.resolve("false");
              }
          }
        });
    } catch (PaygilantRunTimeException e) {
      promise.reject("error", e.getMessage());
    }
  }
    /**
     * Sets the clientSessionId on the Paygilant SDK.
     * @param clientSessionId A non‑empty string you’ve generated client‑side.
     * @param promise Resolves to the actual sessionId received from the SDK,
     *                Rejects with code "error" if a PaygilantRunTimeException is thrown.
     */
    @ReactMethod
    public void setClientSessionId(String clientSessionId, Promise promise) {
        try {
            PaygilantManager
                    .getInstance(getReactApplicationContext())
                    .setClientSessionId(clientSessionId, promise::resolve);
        } catch (PaygilantRunTimeException e) {
              promise.resolve("no_session_id");
        }
    }
}


