package com.gantix.JailMonkey;

import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.JavaScriptModule;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;
import com.gantix.JailMonkey.Magisk.IIsolatedService;
import com.gantix.JailMonkey.Magisk.IsolatedService;

import static android.content.Context.BIND_AUTO_CREATE;
import static com.gantix.JailMonkey.Magisk.MagiskStatus.hasMagisk;

public class JailMonkeyPackage implements ReactPackage {

    private boolean mLoadConstantsAsynchronously;

    public JailMonkeyPackage() {
        this(false);
    }

    public JailMonkeyPackage(boolean loadConstantsAsynchronously) {
        mLoadConstantsAsynchronously = loadConstantsAsynchronously;
    }

    @Override
    public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
        List<NativeModule> modules = new ArrayList<>();
        modules.add(new JailMonkeyModule(reactContext, mLoadConstantsAsynchronously));
        startService(reactContext);


        return modules;
    }



    private void startService(ReactApplicationContext reactContext){
        try{

            ServiceConnection mIsolatedServiceConnection = new ServiceConnection() {
                @Override
                public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
                    IIsolatedService serviceBinder = IIsolatedService.Stub.asInterface(iBinder);

                    try {

                        boolean bIsMagisk = serviceBinder.isMagiskPresent();
                        Log.d("magisk ",bIsMagisk+" ");
                        if(bIsMagisk){
                            hasMagisk = true;
                        }else{
                            hasMagisk = false;
                        }

                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }

                }

                @Override
                public void onServiceDisconnected(ComponentName componentName) {

                }
            };
            Intent intent = new Intent();

            intent.setClass(reactContext, IsolatedService.class);


            /*Binding to an isolated service */
            reactContext.getApplicationContext().bindService(intent, mIsolatedServiceConnection, BIND_AUTO_CREATE);


        }catch(Exception e){
            e.printStackTrace();
        }
    }

    // Deprecated RN 0.47
    public List<Class<? extends JavaScriptModule>> createJSModules() {
        return Collections.emptyList();
    }

    @Override
    public List<ViewManager> createViewManagers(
            ReactApplicationContext reactContext) {
        return Collections.emptyList();
    }

}
