package com.bradbumbalough.RCTTwilioIPMessaging;

import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.modules.core.DeviceEventManagerModule;
import com.twilio.common.TwilioAccessManager;
import com.twilio.common.TwilioAccessManagerFactory;
import com.twilio.common.TwilioAccessManagerListener;

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

public class RCTTwilioAccessManager extends ReactContextBaseJavaModule implements TwilioAccessManagerListener {

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

    public TwilioAccessManager accessManager = null;
    private ReactApplicationContext reactContext;

    public static RCTTwilioAccessManager rctTwilioAccessManager;

    public static RCTTwilioAccessManager getInstance() {
        return rctTwilioAccessManager;
    }

    public RCTTwilioAccessManager(ReactApplicationContext reactContext) {
        super(reactContext);
        this.reactContext = reactContext;
        rctTwilioAccessManager = this;
    }

    @ReactMethod
    public void accessManagerWithToken(String token, Promise promise) {
        RCTTwilioAccessManager tmp = RCTTwilioAccessManager.getInstance();
        tmp.accessManager = TwilioAccessManagerFactory.createAccessManager(token, this);
        promise.resolve(RCTConvert.TwilioAccessManager(tmp.accessManager));
    }

    @ReactMethod
    public void updateToken(String token) {
      RCTTwilioAccessManager tmp = RCTTwilioAccessManager.getInstance();
      tmp.accessManager.updateToken(token);
    }

    @Override
    public void onTokenExpired(TwilioAccessManager twilioAccessManager) {
        reactContext
                .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
                .emit("accessManager:tokenExpired", null);
    }

    @Override
    public void onTokenUpdated(TwilioAccessManager twilioAccessManager) {

    }

    @Override
    public void onError(TwilioAccessManager twilioAccessManager, String s) {
        WritableMap params = Arguments.createMap();
        params.putString("error",s);
        reactContext
                .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
                .emit("accessManager:tokenExpired",params);
    }

}