package com.reactnativepaymentcheckout;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.checkout.android_sdk.CheckoutAPIClient;
import com.checkout.android_sdk.Request.CardTokenisationRequest;
import com.checkout.android_sdk.Response.CardTokenisationFail;
import com.checkout.android_sdk.Response.CardTokenisationResponse;
import com.checkout.android_sdk.Utils.Environment;
import com.checkout.android_sdk.network.NetworkError;
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.ReadableMap;
import com.facebook.react.module.annotations.ReactModule;

@ReactModule(name = PaymentCheckoutModule.NAME)
public class PaymentCheckoutModule extends ReactContextBaseJavaModule {
  public static final String NAME = "PaymentCheckout";
  private ReactApplicationContext mReactContext;
  private Promise promise;

  private CheckoutAPIClient mCheckoutAPIClient;
  private CheckoutAPIClient.OnTokenGenerated mTokenListener;

  public PaymentCheckoutModule(ReactApplicationContext reactContext) {
      super(reactContext);
      this.mReactContext = reactContext;
  }

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

  @ReactMethod
  public void initPayment(@Nullable ReadableMap config, @Nullable ReadableMap paymentParams, Promise promise) {
    this.promise = promise;
    String publicKey = config.getString("publicKey");
    String environment = config.getString("environment");
    Environment checkoutEnv = Environment.SANDBOX;
    if(environment == "prod") {
      checkoutEnv = Environment.LIVE;
    }
    this.mCheckoutAPIClient = new CheckoutAPIClient(this.mReactContext, publicKey, checkoutEnv);
    this.initListeners();
    this.initClient(paymentParams);
  }

  private void initListeners() {
    this.mTokenListener = new CheckoutAPIClient.OnTokenGenerated() {
      @Override
      public void onTokenGenerated(CardTokenisationResponse response) {
        promise.resolve(response.getToken());
      }

      @Override
      public void onError(CardTokenisationFail error) {
        promise.reject("TOKEN_ERROR", error.toString());
      }

      @Override
      public void onNetworkError(NetworkError error) {
        promise.reject("NETWORK_ERROR", error.toString());
      }
    };
  }

  private void initClient(ReadableMap paymentParams) {
    String cardNumber = paymentParams.getString("cardNumber");
    String name = paymentParams.getString("name");
    String expiryMonth = paymentParams.getString("expiryMonth");
    String expiryYear = paymentParams.getString("expiryYear");
    String cvv = paymentParams.getString("cvv");

    this.mCheckoutAPIClient.setTokenListener(mTokenListener);
    this.mCheckoutAPIClient.generateToken(
      new CardTokenisationRequest(cardNumber, name, expiryMonth, expiryYear, cvv ));
  }

}
