package io.lbry.browser.reactmodules;

import android.content.Context;
import android.widget.Toast;

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

import com.mixpanel.android.mpmetrics.MixpanelAPI;

import io.lbry.browser.BuildConfig;

import java.util.HashMap;
import java.util.Map;
import org.json.JSONObject;
import org.json.JSONException;

public class MixpanelModule extends ReactContextBaseJavaModule {

    private static final String MIXPANEL_TOKEN = BuildConfig.DEBUG ?
        "bc1630b8be64c5dfaa4700b3a62969f3" /* Dev Testing */ :
        "93b81fb957cb0ddcd3198c10853a6a95"; /* Production */

    private Context context;

    private MixpanelAPI mixpanel;

    public MixpanelModule(ReactApplicationContext reactContext) {
        super(reactContext);
        this.context = reactContext;
        this.mixpanel = MixpanelAPI.getInstance(this.context, MIXPANEL_TOKEN);
    }

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

    @ReactMethod
    public void track(String name, ReadableMap payload) {
        JSONObject props = new JSONObject();
        try {
            if (payload != null) {
                HashMap<String, Object> payloadMap = payload.toHashMap();
                for (Map.Entry<String, Object> entry : payloadMap.entrySet()) {
                    props.put(entry.getKey(), entry.getValue());
                }
            }
        } catch (JSONException e) {
            // Cannot use props. Stick with empty props.
        }

        if (mixpanel != null) {
            mixpanel.track(name, props);
        }
    }

    @ReactMethod
    public void logException(boolean fatal, String message, ReadableMap payload) {
        JSONObject props = new JSONObject();
        try {
            props.put("Message", message);
            if (payload != null) {
                HashMap<String, Object> payloadMap = payload.toHashMap();
                for (Map.Entry<String, Object> entry : payloadMap.entrySet()) {
                    props.put(entry.getKey(), entry.getValue());
                }
            }
        } catch (JSONException e) {
            // Cannot use props. Stick with empty props.
        }

        if (mixpanel != null) {
            mixpanel.track(fatal ? "Exception" : "Warning", props);
        }

        if (fatal) {
            Toast.makeText(context,
                           "An application error occurred which has been automatically logged. " +
                           "If you keep seeing this message, please provide feedback to the LBRY " +
                           "team by emailing hello@lbry.io.",
                            Toast.LENGTH_LONG).show();
        }
    }
}