package com.snapmint.rn;

import android.app.Activity;
import android.content.Intent;
import android.util.Log;

import com.facebook.react.bridge.ActivityEventListener;
import com.facebook.react.bridge.Arguments;
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.bridge.WritableMap;
import com.facebook.react.modules.core.DeviceEventManagerModule;

import com.snapmint.merchantsdk.snapmintsdk.NewCheckoutWebViewActivity;
import com.snapmint.merchantsdk.constants.SnapmintConfiguration;

import org.json.JSONException;
import org.json.JSONObject;

public class SnapmintRNModule extends ReactContextBaseJavaModule implements ActivityEventListener {

    private static final String TAG = "SnapmintRNModule";
    private final ReactApplicationContext reactContext;

    public SnapmintRNModule(ReactApplicationContext reactContext) {
        super(reactContext);
        this.reactContext = reactContext;
        reactContext.addActivityEventListener(this);
        Log.d(TAG, "SnapmintRNModule initialized");
    }

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

    @ReactMethod
    public void testConnection() {
        Log.d(TAG, "🔥 TEST METHOD CALLED - Bridge is working!");
    }

    @ReactMethod
    public void open(ReadableMap options) {
        Log.d(TAG, "=== PAYMENT STARTED ===");
        Log.d(TAG, "Received options: " + options.toString());
        Activity currentActivity = reactContext.getCurrentActivity();
        if (currentActivity == null) {
            Log.e(TAG, "No current activity available");
            sendEvent("Snapmint::PAYMENT_ERROR", createErrorParams("No activity available"));
            return;
        }
        Log.d(TAG, "Current activity: " + currentActivity.getClass().getSimpleName());
        try {
            String checkoutUrl = options.hasKey("checkoutUrl") ? options.getString("checkoutUrl") : null;
            startSnapmintCheckout(currentActivity, checkoutUrl);
        } catch (Exception e) {
            Log.e(TAG, "Error in open method", e);
            sendEvent("Snapmint::PAYMENT_ERROR", createErrorParams("Error starting checkout: " + e.getMessage()));
        }
    }

    private void startSnapmintCheckout(Activity activity, String checkoutUrl) {
        Log.d(TAG, "=== STARTING SIMPLE NATIVE CHECKOUT ===");
        if (checkoutUrl == null || checkoutUrl.isEmpty()) {
            Log.e(TAG, "Checkout URL is null or empty");
            sendEvent("Snapmint::PAYMENT_ERROR", createErrorParams("Checkout URL is required"));
            return;
        }
        Intent intent = new Intent(activity, NewCheckoutWebViewActivity.class);
        intent.putExtra("redirect_url", checkoutUrl);
        Log.d(TAG, "🚀 Starting Snapmint activity for result...");
        Log.d(TAG, "🔢 Request code: " + SnapmintConfiguration.SNAPMINT_PAYMENT);
        Log.d(TAG, "🌐 Checkout URL: " + checkoutUrl);
        activity.startActivityForResult(intent, SnapmintConfiguration.SNAPMINT_PAYMENT);
        Log.d(TAG, "✅ Activity started successfully - waiting for Snapmint WebView to load");
    }

    @Override
    public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {
        Log.d(TAG, "🎯 === ACTIVITY RESULT RECEIVED ===");
        Log.d(TAG, "🔢 Request code: " + requestCode);
        Log.d(TAG, "📊 Result code: " + resultCode);
        Log.d(TAG, "📄 Intent data: " + (data != null ? data.toString() : "null"));
        if (requestCode == SnapmintConfiguration.SNAPMINT_PAYMENT) {
            Log.d(TAG, "✅ Processing Snapmint payment result");
            try {
                String status = data != null ? data.getStringExtra(SnapmintConfiguration.STATUS) : null;
                Log.d(TAG, "Received status: " + status);
                String payload = data != null ? data.getStringExtra("data") : null;
                Log.d(TAG, "Received payload: " + (payload != null ? payload : "<none>"));
                WritableMap params = Arguments.createMap();
                boolean isSuccess = status != null && SnapmintConfiguration.SUCCESS.equalsIgnoreCase(status);
                params.putString("status", status != null ? status : "failure");
                params.putInt("statusCode", isSuccess ? 200 : 400);
                if (payload != null) {
                    params.putString("data", payload);
                    params.putString("responseMsg", payload);
                    params.putString("message", payload);
                } else {
                    // Ensure message/responseMsg are non-empty for UI display parity with iOS/Flutter
                    String msg = (status != null && !status.isEmpty()) ? status : "Payment failed";
                    params.putString("responseMsg", msg);
                    params.putString("message", msg);
                }
                if (isSuccess) {
                    Log.d(TAG, "🎉 Payment Success");
                    sendEvent("Snapmint::PAYMENT_SUCCESS", params);
                } else {
                    Log.d(TAG, "❌ Payment Failed");
                    sendEvent("Snapmint::PAYMENT_ERROR", params);
                }
            } catch (Exception e) {
                Log.e(TAG, "Error processing activity result", e);
                WritableMap err = Arguments.createMap();
                err.putString("status", "failure");
                err.putInt("statusCode", 400);
                err.putString("message", e.getMessage());
                sendEvent("Snapmint::PAYMENT_ERROR", err);
            }
        } else {
            Log.d(TAG, "❌ Not a Snapmint payment result");
        }
    }

    private WritableMap createErrorParams(String message) {
        WritableMap params = Arguments.createMap();
        params.putString("status", "failure");
        params.putString("message", message);
        return params;
    }

    @Override
    public void onNewIntent(Intent intent) {
        Log.d(TAG, "onNewIntent called");
    }

    private void sendEvent(String eventName, WritableMap params) {
        Log.d(TAG, "Sending event: " + eventName + " with params: " + params.toString());
        reactContext
                .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
                .emit(eventName, params);
    }
}
