package com.readyio.readywallet;


import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Build;
import android.os.Bundle;


import com.bitgo.randombytes.RandomBytesPackage;
import com.facebook.hermes.reactexecutor.HermesExecutorFactory;
import com.facebook.react.ReactActivity;
import com.facebook.react.ReactInstanceManager;
import com.facebook.react.ReactPackage;
import com.facebook.react.ReactRootView;

import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.common.LifecycleState;
import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
import com.facebook.react.modules.core.DeviceEventManagerModule;
import com.facebook.react.shell.MainReactPackage;
import com.gzip.GzipPackage;
import com.horcrux.svg.SvgPackage;
import com.learnium.RNDeviceInfo.RNDeviceInfo;
import com.lewin.qrcode.QRScanReaderPackage;
import com.nozbe.watermelondb.WatermelonDBPackage;
import com.oblador.keychain.KeychainPackage;
import com.reactnativecommunity.asyncstorage.AsyncStoragePackage;
import com.reactnativecommunity.cameraroll.CameraRollPackage;
import com.reactnativecommunity.clipboard.ClipboardPackage;
import com.reactnativecommunity.netinfo.NetInfoPackage;
import com.readyio.readynative.ReadyNativePackage;

import com.readyio.readywallet.splash.ReadySplash;
import com.rnbiometrics.ReactNativeBiometricsPackage;
import com.rnfs.RNFSPackage;
import com.swmansion.gesturehandler.RNGestureHandlerPackage;
import com.swmansion.reanimated.ReanimatedPackage;
import com.th3rdwave.safeareacontext.SafeAreaContextPackage;
import com.walletconnect.reactnativemodule.RNWalletConnectModulePackage;

import org.linusu.RNGetRandomValuesPackage;
import org.reactnative.camera.RNCameraPackage;
import com.reactnativecommunity.webview.RNCWebViewPackage;
import com.reactcommunity.rndatetimepicker.RNDateTimePickerPackage;
import com.imagepicker.ImagePickerPackage;
import fr.greweb.reactnativeviewshot.RNViewShotPackage;

import java.util.ArrayList;
import java.util.Arrays;

import cl.json.RNSharePackage;
import io.invertase.firebase.analytics.ReactNativeFirebaseAnalyticsPackage;
import io.invertase.firebase.app.ReactNativeFirebaseAppPackage;
import io.sentry.react.RNSentryPackage;
import com.reactnativepbkdf2.Pbkdf2Package;

public class ReadyWalletActivity extends ReactActivity implements DefaultHardwareBackBtnHandler {
    public static final String BROASCAST_EVENT = "android.intent.action.ready.wallet";
    public static final String PUSH_EVENT_NAME = "ReadyWallet_FOREGROUND_PUSH_EVENT";
    public static final String DEEPLINK_EVENT_NAME = "ReadyWallet_FOREGROUND_DEEPLINK_EVENT";

    public static Boolean isLaunch = false;
    private static ReadyWalletActivity mInstance;
    private ReactRootView mReactRootView;
    private ReactInstanceManager mReactInstanceManager;

    private BroadcastReceiver myReceiver = new BroadcastReceiver() {
      @Override
      public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (BROASCAST_EVENT.equals(action)) {
          Bundle bundle  = intent.getBundleExtra("data");
          String type = intent.getStringExtra("type");
          WritableMap params = Arguments.createMap();
          if (type != null && type.equals(DEEPLINK_EVENT_NAME)){
            params.putString("deepLinkUrl", bundle.getString("deepLinkUrl"));
          }
          if (type != null && type.equals(PUSH_EVENT_NAME)){
            params.putString("event", bundle.getString("event"));
            params.putString("destination", bundle.getString("destination"));
            params.putString("data", bundle.getString("data"));
          }
          sendEvent(type, params);
        }
      }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ReadySplash.show(this, true);// ⬅️ initialize the splash screen
        super.onCreate(savedInstanceState);
        mInstance = this;
        Bundle bundle = getIntent().getExtras();
        assert bundle != null;
        Bundle initProps = bundle.getBundle("initProps");
        mReactRootView = new ReactRootView(this);

        mReactInstanceManager = ReactInstanceManager.builder()
                .setApplication(getApplication())
                .setJavaScriptExecutorFactory(new HermesExecutorFactory())
                .setCurrentActivity(this)
                .setBundleAssetName("ReadyWallet.bundle")
                .setJSMainModulePath("index")
                .addPackages(getPackages())
                .setUseDeveloperSupport(false)
                .setInitialLifecycleState(LifecycleState.RESUMED)
                .build();
        mReactRootView.startReactApplication(mReactInstanceManager, "ReadyWallet", initProps);
        setContentView(mReactRootView);

        // Register the receiver
        if (Build.VERSION.SDK_INT >= 33 && getApplicationInfo().targetSdkVersion >= 33) {
          registerReceiver(myReceiver, new IntentFilter(BROASCAST_EVENT), Context.RECEIVER_EXPORTED);
        } else {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
              registerReceiver(myReceiver, new IntentFilter(BROASCAST_EVENT), Context.RECEIVER_EXPORTED);
            } else {
              registerReceiver(myReceiver, new IntentFilter(BROASCAST_EVENT));
            }
        }
        isLaunch= true;
    }

    // Use the context to send events
    private void sendEvent(String type, WritableMap params) {
      mReactRootView.getReactInstanceManager().getCurrentReactContext().getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
          .emit(type, params);
    }

    public ArrayList<ReactPackage> getPackages() {
        return new ArrayList<>(Arrays.asList(
                new MainReactPackage(),
                new ReadyWalletPackage(),
                new RNGestureHandlerPackage(),
                new AsyncStoragePackage(),
                new SafeAreaContextPackage(),
                new NetInfoPackage(),
                new RNSharePackage(),
                new ReanimatedPackage(),
                new ClipboardPackage(),
                new RNFSPackage(),
                new RNDeviceInfo(),
                new ReactNativeBiometricsPackage(),
                new RandomBytesPackage(),
                new RNGetRandomValuesPackage(),
                new WatermelonDBPackage(),
                new RNCameraPackage(),
                new SvgPackage(),
                new KeychainPackage(),
                new CameraRollPackage(),
                new RNSentryPackage(),
                new RNWalletConnectModulePackage(),
                new RNCWebViewPackage(),
                new RNDateTimePickerPackage(),
                new ReactNativeFirebaseAppPackage(),
                new ReactNativeFirebaseAnalyticsPackage(),
                new GzipPackage(),
                new ImagePickerPackage(),
                new RNViewShotPackage(),
                new QRScanReaderPackage(),
                new Pbkdf2Package(),
                new ReadyNativePackage()
        ));
    }
    public static void close() {
        if (mInstance != null) mInstance.finish();
        mInstance = null;
    }
    @Override
    protected void onPause() {
        super.onPause();
        if (mReactInstanceManager != null) {
            mReactInstanceManager.onHostPause(this);
        }
    }
    @Override
    protected void onResume() {
        super.onResume();
        if (mReactInstanceManager != null) {
            mReactInstanceManager.onHostResume(this, this);
        }
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        isLaunch= false;
        if (mReactInstanceManager != null) {
            mReactInstanceManager.onHostDestroy(this);
        }
        if (mReactRootView != null) {
            mReactRootView.unmountReactApplication();
        }
        unregisterReceiver(myReceiver);
    }
    @Override
    public void invokeDefaultOnBackPressed() {
      super.onBackPressed();
    }
    @Override
    public void onBackPressed() {
        if (mReactInstanceManager != null) {
            mReactInstanceManager.onBackPressed();
        } else {
            super.onBackPressed();
        }
    }
    @Override
    public void onActivityResult(int requestCode, int resultCode, @androidx.annotation.Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        mReactInstanceManager.onActivityResult(this, requestCode, resultCode, data);
    }
}
