package com.reactnativeippopay;

import androidx.annotation.NonNull;

import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.module.annotations.ReactModule;

import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.ReactContext;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.ippopay.core.IppoPayListener;
import com.ippopay.core.IppoPayLog;
import com.ippopay.core.IppoPayPay;
import com.ippopay.models.OrderData;

import org.json.JSONObject;

@ReactModule(name = IppopayModule.NAME)
public class IppopayModule extends ReactContextBaseJavaModule implements IppoPayListener {

  private ReactContext context;

  private Callback callback;

  public static final String NAME = "IppoPayment";

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

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

  @ReactMethod
  public void initSDK(String publicKey) {
    try {
      IppoPayPay.init(context, publicKey);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  @ReactMethod
  public void makePayment(String dataObj, Callback callback) {
    try {
      this.callback = callback;
      IppoPayPay.setPaymentListener(this);
      IppoPayPay.makePayment(getGson().fromJson(dataObj, OrderData.class));
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  @ReactMethod
  public void setLogVisibility(boolean visibility) {
    try {
      IppoPayLog.setLogVisible(visibility);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  public Gson getGson() {
    return new GsonBuilder().create();
  }

  @Override
  public void onTransactionSuccess(String transactionId) {
    sendCallBack(true, transactionId, "Payment Success");
  }

  @Override
  public void onTransactionFailure(String error, String transaction_id) {
    sendCallBack(false, null, error);
  }

  @Override
  public void onTransactionPending(String error, String transaction_id) {
    sendCallBack(true, transaction_id, error);
  }

  @Override
  public void onTransactionCancelled() {
    sendCallBack(false, null, "Payment Cancelled");
  }

  private void sendCallBack(boolean success, String transactionId, String message) {
    try {
      if (callback != null) {
        JSONObject jsonObj = new JSONObject();
        jsonObj.put("success", success);
        jsonObj.put("message", message);
        jsonObj.put("transaction_id", transactionId);
        callback.invoke(jsonObj.toString());
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}
