package com.reactNativeQuickActions;

import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ShortcutInfo;
import android.content.pm.ShortcutManager;
import android.graphics.drawable.Icon;
import android.os.Build;
import android.os.PersistableBundle;

import com.facebook.react.bridge.ActivityEventListener;
import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.JSApplicationIllegalArgumentException;
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.bridge.ReadableArray;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.module.annotations.ReactModule;
import com.facebook.react.modules.core.DeviceEventManagerModule;

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

@ReactModule(name = AppShortcutsModule.REACT_NAME)
class AppShortcutsModule extends ReactContextBaseJavaModule {

    static final String REACT_NAME = "ReactAppShortcuts";

    private static final String ACTION_SHORTCUT = "ACTION_SHORTCUT";
    private static final String SHORTCUT_ITEM = "SHORTCUT_ITEM";

    AppShortcutsModule(ReactApplicationContext reactContext) {
        super(reactContext);

        reactContext.addActivityEventListener(new ActivityEventListener() {
            @Override
            public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {
                // Do nothing
            }

            @Override
            public void onNewIntent(Intent intent) {
                sendJSEvent(intent);
            }
        });
    }

    @Override
    public String getName() {
        return REACT_NAME;
    }

    @ReactMethod
    @TargetApi(25)
    public void popInitialAction(Promise promise) {
        try {
            Activity currentActivity = getCurrentActivity();
            WritableMap map = null;

            if (currentActivity != null) {
                Intent intent = currentActivity.getIntent();

                if (ACTION_SHORTCUT.equals(intent.getAction())) {
                    PersistableBundle bundle = intent.getParcelableExtra(SHORTCUT_ITEM);
                    if (bundle != null) {
                        ShortcutItem item = ShortcutItem.fromPersistableBundle(bundle);
                        map = item.toWritableMap();
                    }
                }
            }

            promise.resolve(map);
        } catch (Exception e) {
            promise.reject(new JSApplicationIllegalArgumentException(
                    "AppShortcuts.popInitialAction error. " + e.getMessage()));
        }
    }

    @ReactMethod
    @TargetApi(25)
    public void setShortcutItems(ReadableArray items) {
        if (!isShortcutSupported() || items.size() == 0) {
            return;
        }

        Activity currentActivity = getCurrentActivity();
        if (currentActivity == null) {
            return;
        }

        Context context = getReactApplicationContext();
        List<ShortcutInfo> shortcuts = new ArrayList<>(items.size());

        for (int i = 0; i < items.size(); i++) {
            ShortcutItem item = ShortcutItem.fromReadableMap(items.getMap(i));

            int iconResId = context.getResources()
                    .getIdentifier(item.icon, "drawable", context.getPackageName());
            Intent intent = new Intent(context, currentActivity.getClass());
            intent.setAction(ACTION_SHORTCUT);
            intent.putExtra(SHORTCUT_ITEM, item.toPersistableBundle());

            shortcuts.add(new ShortcutInfo.Builder(context, "id" + i)
                    .setShortLabel(item.title)
                    .setLongLabel(item.title)
                    .setIcon(Icon.createWithResource(context, iconResId))
                    .setIntent(intent)
                    .build());
        }

        getReactApplicationContext().getSystemService(ShortcutManager.class).setDynamicShortcuts(shortcuts);
    }

    @ReactMethod
    @TargetApi(25)
    public void clearShortcutItems() {
        if (!isShortcutSupported()) {
            return;
        }

        getReactApplicationContext().getSystemService(ShortcutManager.class).removeAllDynamicShortcuts();
    }

    @ReactMethod
    public void isSupported(Callback callback) {
        if (callback != null) {
            callback.invoke(null, isShortcutSupported());
        }
    }

    private boolean isShortcutSupported() {
        return Build.VERSION.SDK_INT >= 25;
    }

    private void sendJSEvent(Intent intent) {
        if (!ACTION_SHORTCUT.equals(intent.getAction()) || !isShortcutSupported()) {
            return;
        }

        ShortcutItem item = null;
        PersistableBundle bundle = intent.getParcelableExtra(SHORTCUT_ITEM);
        if (bundle != null) {
            item = ShortcutItem.fromPersistableBundle(bundle);
        }
        if (item != null) {
            getReactApplicationContext()
                    .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
                    .emit("quickActionShortcut", item.toWritableMap());
        }
    }
}