package com.gliabridge;

import androidx.annotation.NonNull;

import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.module.annotations.ReactModule;
import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.bridge.ReadableMapKeySetIterator;

import com.glia.androidsdk.SiteApiKey;
import com.google.gson.internal.LinkedTreeMap;
import android.content.Intent;
import android.content.Context;

import com.glia.widgets.GliaWidgets;
import com.glia.widgets.GliaWidgetsConfig;
import com.glia.androidsdk.GliaConfig.Regions;
import com.glia.widgets.chat.ChatActivity;
import com.glia.widgets.call.CallActivity;
import com.glia.androidsdk.Glia;
import com.glia.androidsdk.visitor.VisitorInfoUpdateRequest;
import com.glia.widgets.UiTheme;

@ReactModule(name = GliaBridgeModule.NAME)
public class GliaBridgeModule extends ReactContextBaseJavaModule {
    public static final String NAME = "GliaBridge";

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

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

    @ReactMethod
    public void configure(String siteKeyId, String siteKeySecret, String siteId, String queueId, String contextUrl) {
        Context applicationContext = getReactApplicationContext();

        GliaWidgetsConfig gliaConfig = new GliaWidgetsConfig.Builder()
          .setSiteApiKey(new SiteApiKey(siteKeyId, siteKeySecret))
          .setSiteId(siteId)
          .setRegion(Regions.US)
          .setContext(applicationContext)
          .build();

        try {
            GliaWidgets.init(gliaConfig);
        } catch (Exception e) {

        }
    }

    @ReactMethod
    public void launchChat(String companyName, String contextURL, String queueId) {
        ReactApplicationContext context = getReactApplicationContext();

        Intent intent = new Intent(context, ChatActivity.class);
        intent.putExtra(GliaWidgets.COMPANY_NAME, companyName);
        intent.putExtra(GliaWidgets.QUEUE_ID, queueId);
        intent.putExtra(GliaWidgets.CONTEXT_URL, contextURL);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);
    }

    @ReactMethod
    public void launchAudioCall(String companyName, String contextURL, String queueId) {
        ReactApplicationContext context = getReactApplicationContext();
        Intent intent = new Intent(context, CallActivity.class);
        intent.putExtra(GliaWidgets.COMPANY_NAME, companyName);
        intent.putExtra(GliaWidgets.QUEUE_ID, queueId);
        intent.putExtra(GliaWidgets.CONTEXT_URL, contextURL);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);
    }

    @ReactMethod
    public void launchVideoCall(String companyName, String contextURL, String queueId) {
        ReactApplicationContext context = getReactApplicationContext();
        Intent intent = new Intent(context, CallActivity.class);
        intent.putExtra(GliaWidgets.COMPANY_NAME, companyName);
        intent.putExtra(GliaWidgets.QUEUE_ID, queueId);
        intent.putExtra(GliaWidgets.CONTEXT_URL, contextURL);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);
    }

    @ReactMethod
    public void updateVisitorInfo(String name, String email, String note, String phone, ReadableMap customAttributes) {
        LinkedTreeMap customAttributeMap = new LinkedTreeMap<>();
        ReadableMapKeySetIterator iterator = customAttributes.keySetIterator();
        while (iterator.hasNextKey()) {
            String key = iterator.nextKey();
            String val = customAttributes.getString(key);
            customAttributeMap.put(key, val);
        }

        Glia.updateVisitorInfo(new VisitorInfoUpdateRequest.Builder().setName(name).setEmail(email).setNote(note)
                .setPhone(phone).setCustomAttributes(customAttributeMap).build(), error -> {
                    /* Handle callback */ });
    }
}
