package com.xg.navigation.fragment;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.view.View;

import com.facebook.react.ReactInstanceManager;
import com.facebook.react.ReactRootView;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.modules.core.DeviceEventManagerModule;
import com.xg.navigation.NavigationApplication;
import com.xg.navigation.activities.ProxyActivity;
import com.xg.navigation.data.DataManager;
import com.xg.navigation.delegates.ReactDelegate;

import java.util.Map;

/**
 * 放在首页中用来加载JS的子Fragment
 */
public class ReactItem extends ReactDelegate {

    private ReactRootView mReactRootView;

    public static ReactItem newInstance(Bundle bundle) {

        if (bundle == null) {
            bundle = new Bundle();
        }

        ReactItem fragment = new ReactItem();
        fragment.setArguments(bundle);
        return fragment;
    }

    @Override
    public Object setLayout() {

        ProxyActivity proxyActivity = getProxyActivity();
        Bundle params = getArguments();
        if (params == null) {
            params = new Bundle();
        }
        params.putBundle("route", generateRoute());

        mReactRootView = new ReactRootView(proxyActivity);
        ReactInstanceManager reactInstanceManager = ((NavigationApplication)proxyActivity.getApplication()).getReactNativeHost().getReactInstanceManager();
        mReactRootView.startReactApplication(reactInstanceManager, DataManager.getInstance().getMainComponentName(), params);

        return mReactRootView;
    }

    @Override
    public void onBindView(@Nullable Bundle savedInstanceState, @NonNull View rootView) {

    }

    @Override
    public void onDestroyView() {
        if (mReactRootView != null) {
            mReactRootView.unmountReactApplication();
            mReactRootView = null;
        }
        super.onDestroyView();
    }

    protected void sendEvent(String eventName, @Nullable WritableMap params) {
        ReactContext reactContext = ((NavigationApplication)getProxyActivity().getApplication()).getReactContext();
        if (reactContext != null) {
            reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
                    .emit(eventName, params);
        }
    }

    @Override
    public Bundle generateRoute() {
        String pagePath = null, uniqueId = null, pageType = null;
        try {
            Bundle params = getArguments();
            pagePath = params.getString("pagePath");
            pageType = params.getString("pageType");
            uniqueId = params.getString("uniqueId");
        } catch (Exception ignored) {}

        if (TextUtils.isEmpty(pagePath)) {
            pagePath = "";
        }

        if (TextUtils.isEmpty(pageType)) {
            pageType = "";
        }

        if (TextUtils.isEmpty(uniqueId)) {
            uniqueId = "";
        }

        Bundle bundle = new Bundle();
        bundle.putString("pagePath", pagePath);
        bundle.putString("uniqueId", uniqueId);
        bundle.putString("pageType", pageType);
        return bundle;
    }

    @Override
    public Map<String, Object> setNavigationParams() {
        return toMap();
    }

    /**
     * 重写返回方法
     * @return
     */
    @Override
    public boolean onBackPressedSupport() {

        if (getChildFragmentManager().getBackStackEntryCount() > 1) {
            getSupportDelegate().popChild();
            return true;
        }

        return getParentDelegate().onBackPressedSupport();
    }
}
