package com.sekizlipenguen.reactnativeappexit;

import android.app.Activity;
import android.content.Intent;
import android.os.Handler;
import android.os.Looper;
import android.os.Process;

import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;

public class ReactNativeAppExitModule extends ReactContextBaseJavaModule {

    public static final String NAME = "ReactNativeAppExit";

    public ReactNativeAppExitModule(ReactApplicationContext reactContext) {
        super(reactContext);
    }

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

    @ReactMethod
    public void exitApp() {
        final Activity activity = getCurrentActivity();
        if (activity != null) {
            activity.runOnUiThread(() -> {
                activity.finishAffinity();
                Process.killProcess(Process.myPid());
                System.exit(0);
            });
            return;
        }
        Process.killProcess(Process.myPid());
        System.exit(0);
    }

    @ReactMethod
    public void restartApp() {
        final Activity currentActivity = getCurrentActivity();
        if (currentActivity == null) {
            return;
        }

        final Intent intent = currentActivity.getPackageManager()
                .getLaunchIntentForPackage(currentActivity.getPackageName());

        if (intent == null) {
            return;
        }

        intent.addFlags(
                Intent.FLAG_ACTIVITY_NEW_TASK
                        | Intent.FLAG_ACTIVITY_CLEAR_TASK
                        | Intent.FLAG_ACTIVITY_CLEAR_TOP
        );

        new Handler(Looper.getMainLooper()).postDelayed(() -> {
            currentActivity.startActivity(intent);
            currentActivity.finishAffinity();
            Process.killProcess(Process.myPid());
            System.exit(0);
        }, 100);
    }
}
