package com.reactnativebluestackmodule;

import android.util.Log;
import android.app.Activity;
import android.content.Context;
import androidx.annotation.NonNull;

import java.util.List;
import java.util.ArrayList;

import com.facebook.react.bridge.LifecycleEventListener;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.*;

import com.mngads.MNGAdsFactory;
import com.mngads.listener.MNGAdsSDKFactoryListener;
import com.mngads.models.BlueStackInitializationStatus;
import com.mngads.models.BlueStackAdapterStatus;

import com.reactnativebluestackmodule.common.ReactNativeModule;

// Used for the call to addCallback() within this snippet.
// import com.google.common.util.concurrent.Futures;

class BluestackManager extends ReactNativeModule implements MNGAdsSDKFactoryListener, LifecycleEventListener {

    private static final String TAG = "BluestackManager Bridge";
    private static final String CLASS_NAME = "BluestackManager";
    private static final int EVENT_INIT_SUCCESS = 1;
    private static final String EVENT_INIT_FAILED = "SDK_FAILED_TO_INIT";

    // private Promise mPromise;
    private List<Promise> promiseList = new ArrayList<>(); // list of promises
    private boolean isInitInProgress = false;

    public BluestackManager(ReactApplicationContext reactContext) {
        super(reactContext, TAG);
        reactContext.addLifecycleEventListener(this);
    }

    @NonNull
    @Override
    public String getName() {
        return CLASS_NAME;
    }

    @Override
    public void initialize() {
        super.initialize();
    }

    @ReactMethod
    public void initializeSDK(String appId, boolean EnableDebug, Promise p) {
        promiseList.add(p);
        if (!isInitInProgress) {
            Log.d(TAG, "Native BluestackManager initializeSDK");
            MNGAdsFactory.setDebugModeEnabled(EnableDebug);
            MNGAdsFactory.setMNGAdsSDKFactoryListener(this);
            MNGAdsFactory.initialize(getContext(), appId);
            isInitInProgress = true;
        }
    }

    @Override
    public void onMNGAdsSDKFactoryDidFinishInitializing() {
        Log.d(TAG, "onMNGAdsSDKFactoryDidFinishInitializing");
        isInitInProgress = false;
        // resolve all promises in the list
        for (Promise promise : promiseList) {
            promise.resolve(EVENT_INIT_SUCCESS);
        }
        promiseList.clear();
    }

    @Override
    public void onMNGAdsSDKFactoryDidFailInitialization(Exception e) {
        Log.d(TAG, "onMNGAdsSDKFactoryDidFailInitialization");
        isInitInProgress = false;
        // reject all promises in the list
        for (Promise promise : promiseList) {
            promise.reject(EVENT_INIT_FAILED, e.getMessage());
        }
        promiseList.clear();
    }

    @Override
    public void onMNGAdsSDKFactoryAdapterInitializationStatus(BlueStackInitializationStatus initializationStatus) {
        List<BlueStackAdapterStatus> adapterStatusList = initializationStatus.getAdapterStatus();

        // Log.d(TAG, "BlueStack Adapters Initialization Status: ");
        // for (BlueStackAdapterStatus adapterStatus : adapterStatusList) {
        // Log.d(TAG, " Provider: " + adapterStatus.getProvider() +
        // ", Description: " + adapterStatus.getDescriptionStatus() +
        // ", State: " + adapterStatus.getState());
        // }
    }

    @Override
    public void onHostResume() {

    }

    @Override
    public void onHostPause() {

    }

    @Override
    public void onHostDestroy() {
        promiseList.clear();
    }
}
