package com.amplifypay;

import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.json.JSONArray;
import org.json.JSONException;

/**
 * This class echoes a string called from JavaScript.
 */
public class PaymentPlugin extends CordovaPlugin {

    public static final String ACTION_MAKE_PAYMENT = "makePayment";

    @Override
    public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException
    {
        try
        {
            if(action.equals(MAKE_PAYMENT))
            {
                JSONObject payload = args.getJSONObject(0);
                String customerName = payload.getString('customerName');
                String customerEmail = payload.getString('customerEmail');
                String description = payload.getString('description');
                long amount = payload.getLong('amount');
                String referenceId = payload.getString('referenceId');
                long planId = payload.getLong('planId');

                String merchantId = payload.getString('merchantId');
                String apiKey = payload.getString('apiKey');

                this.makePayment(customerName, customerEmail, description, amount, referenceId, planId, merchantId, apiKey, callbackContext);
                return true;
            }
            callbackContext.error("Invalid action");
            return false;
        }
        catch (Exception e)
        {
            System.err.println("Exception: " + e.getMessage());
            callbackContext.error(e.getMessage());
            return false;
        }
    }

    protected void makePayment(String customerName, String customerEmail, String description, long amount, String referenceId, long planId, String merchantId, String apiKey, CallbackContext cbc)
    {
        AmplifyPaySDK.initialize(merchantId, apiKey);

        //build a payment object
        PaymentObject paymentObject = new PaymentObject.Builder()
                .setAmount(amount)
                .setCustomerName(customerName)
                .setCustomerEmail(customerEmail)
                .setPaymentDescription(description)
                .setPlanId(planId)
                .setTransID(referenceId)
                .create();

        //Make payment and set call back to recieve payment result
        AmplifyPaySDK.getInstance()
                .setResultCallback(new ResultCallback<TransactionResult>() {
                    @Override
                    public void onError(Throwable t) {
                        result.setText(Arrays.toString(t.getStackTrace()));
                        cbc.error(Arrays.toString(t.getStackTrace()));
                    }

                    @Override
                    public void onPaymentSuccessful(TransactionResult transactionResult) {
                        result.setText(transactionResult.getTransactionRef());
                        cbc.success(transactionResult.getTransactionRef());
                    }
                })
                .makePayment(MainActivity.this, paymentObject);
    }
}
